考虑这个最小的 Spark 作业,它将 CSV 读取到 DataFrame 并将其写为 Parquet:
val df = spark.read.format("csv").option("inferSchema", true).load(filename)
df.write.parquet("parquet_folder/")
对于输入文件中的任何时间戳列,Parquet 输出将包含具有即时语义的时间戳,解释当前 Spark 会话/JVM 时区中源数据中的时间字符串。因此,如果我的 Spark 作业在 EST/EDT 中运行,“2020-01-01 00:00”将变为“2020-01-01 00:00-0500”。
这意味着,除非所有 Spark 作业都在一个一致的时区中运行,否则我可能会有差异。
还有一个理论上的问题是 Parquet 实际上并不代表我的数据。我不知道文件中的午夜是否真的是 EST、PST、UTC 等的午夜,我真的不在乎。
Parquet 格式确实支持具有本地时间语义的时间戳概念,类似于java.util.LocalDateTime
- 日期/时间的抽象概念,而不是特定时刻,无论 Spark 会话或 JVM 的时区如何,都将一致地解释它。
我想要的是 Spark 将时间戳从 CSV 读取到本地时间,然后相应地写入 Parquet。理想情况下,我也想从日期和“没有时区的时间戳”列中将其应用于 Spark JDBC 提取。
这甚至可能吗?
(注:Parquet 格式文档解释了即时语义和本地时间语义之间的区别。)