Spark的timestamp 数据时间问题

使用Spark来处理国际业务数据,涉及到数据时区转换,在实际项目中出现时区转换问题。
使用代码:

spark.conf.set("spark.sql.session.timeZone", "Asia/Hong_Kong")
spark.selectExpr("date_format(eff_dt, 'yyyyMMdd') as df_eff_dt").collect()

但在实际Cluster 去run job的时候,如果给一个eff_dt为2024-02-01T00:00:00+0800的时间,但是往往会出现df_eff_dt为20240131的日期。

解决方案

通过参考databricks的一篇对timestamp的文档介绍,在databricks3.0以后的版本,就从之前的hybrid calendar(Julian和Gregorian calendar的合并),转换成使用Proleptic Gregorian calendar为规范来生成date和timestamp。但是本身如果使用dataframe的collect()方法, spark为了兼容性问题,仍然会返回hybrid calendar(java.sql.Date and java.sql.Timestamp)。
为了解决日历问题返回的时间错误:

Java 8 API 能够通过设置spark.sql.datetime.java8API.enabled来解决时间问题。

PySpark可以采用pandas的方式,解决问题,解决function如下。

spark.selectExpr("date_format(eff_dt, 'yyyyMMdd') as df_eff_dt").toPandas()['df_eff_dt']

参考内容

A Comprehensive Look at Dates and Timestamps in Apache Spark™ 3.0

Apache Spark 是一个用于大规模数据处理的开源框架,它支持多种数据类型以适应不同类型的数据操作。Spark 提供了丰富的数据抽象层,包括: 1. **基本数据类型** (Primitives):例如整数类型(`Int`, `Long`, `Short`, `Byte`, `Double`, `Float`),字符串 (`String`),布尔值 (`Boolean`),以及日期和时间 (`Date`, `Timestamp`)。 2. **复杂数据类型** (Compound Types): - **数组(Array)**:Spark 支持动态数组,即可以包含不同类型的元素。 - **数组套数组(Array of Arrays)**:类似于二维数组。 - **集合(Struct)**:类似于键值对的集合,可以用字段名访问元素。 - **Map类型(Map)**:键值对的集合,键可以是任意类型。 - **序列(Sequence)**:包括数组、列表和集合,都是元素有序的数据结构。 3. **DataFrame 和 Dataset**:Spark 的核心数据结构,它们是列式存储的数据集,类似于 SQL 中的关系型表。它们使用列名进行索引,并支持高效的向量化计算。 4. **RDD (Resilient Distributed Datasets)**:原始的分布式数据集,虽然现在 DataFrame 和 Dataset 更受欢迎,但在早期版本中,RDD 也是主要的数据处理单元。 5. **流(Stream)**:Spark Streaming 用于处理实时数据流,支持各种数据源的输入。 6. **Spark SQL 兼容数据类型**:除了基本类型,还支持更复杂的 SQL 数据类型,如 TimestampNTZ, ArrayType, MapType 等。 对于具体的问题,你可以问:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值