我目前正在将基于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
?
1条答案
按热度按时间z31licg01#
设置
spark.sql.legacy.timeParserPolicy
至LEGACY
应该会成功的。至于更改的原因,似乎是为了与其他apache项目(如pandas、r和apachearrow)保持一致,这些项目都使用前公历。
有关详细信息,请参阅:https://databricks.com/blog/2020/07/22/a-comprehensive-look-at-dates-and-timestamps-in-apache-spark-3-0.html