spark 3.0在timestamp数据类型列上使用partitionby时行为的变化?

rm5edbpk  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(323)

我目前正在将基于spark的服务从2.4.5迁移到3.0.0。
我注意到在申请时行为发生了变化 partition 数据类型为 Timestamp 价值观。
在写入Dataframe(parquet)时,一切都按预期工作(数据是针对请求的分区写入的,但是在读取保存的Dataframe时,我看到对 Date 当然会影响下游逻辑的数据类型对象。
示例代码:

val sparkImplicits = spark.implicits
import sparkImplicits._
val simpleData = Seq(
  (1, "abd", Timestamp.valueOf("2020-01-01 00:00:01")),
  (2, "def", Timestamp.valueOf("2019-01-01 00:00:02"))
)

val df = simpleData.toDF("id", "str", "timestamp")

df.printSchema()
df.show()
df.write.partitionBy("timestamp").parquet("partition_by_timestamp")

val readDF = spark.read.parquet("partition_by_timestamp")
readDF.printSchema()
readDF.show(2)

提供的代码段的输出:

root
 |-- id: integer (nullable = false)
 |-- str: string (nullable = true)
 |-- timestamp: timestamp (nullable = true)

+---+---+-------------------+
| id|str|          timestamp|
+---+---+-------------------+
|  1|abd|2020-01-01 00:00:01|
|  2|def|2019-01-01 00:00:02|
+---+---+-------------------+

root
 |-- id: integer (nullable = true)
 |-- str: string (nullable = true)
 |-- timestamp: date (nullable = true)

+---+---+----------+
| id|str| timestamp|
+---+---+----------+
|  1|abd|2020-01-01|
|  2|def|2019-01-01|
+---+---+----------+

更改的起源是什么?我应该如何保持加载的dataframe列timestamp的值和类型不变 Timestamp ?

z31licg0

z31licg01#

设置 spark.sql.legacy.timeParserPolicyLEGACY 应该会成功的。
至于更改的原因,似乎是为了与其他apache项目(如pandas、r和apachearrow)保持一致,这些项目都使用前公历。
有关详细信息,请参阅:https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html

相关问题