考虑这个最小的spark作业,它将csv读取到Dataframe并将其作为parquet写入:
val df = spark.read.format("csv").option("inferSchema", true).load(filename)
df.write.parquet("parquet_folder/")
对于输入文件中的任何timestamp列,parquet输出将包含一个带有即时语义的时间戳,用于解释当前spark会话/jvm时区中源数据中的时间字符串。因此,“2020-01-01 00:00”变为“2020-01-01 00:00-0500”,如果我的spark作业在est/edt中运行。
这意味着,除非所有spark作业都在一个一致的时区中运行,否则我可能会有差异。
还有一个理论上的问题,那就是Parquet地板实际上并不代表我的数据。我不知道文件中的午夜是否真的是美国东部时间午夜、太平洋标准时间午夜、utc午夜等等,我也不在乎。
parquet格式确实支持时间戳的概念,其本地时间语义类似于 java.util.LocalDateTime
--一个抽象的日期/时间概念,而不是一个特定的时间点,不管spark会话或jvm的时区如何,它都会得到一致的解释。
我想让spark将时间戳从csv读入本地时间,并相应地写入parquet。理想情况下,我也希望将相同的方法应用于spark jdbc提取,从date和“timestamp without time zone”列中提取。
这有可能吗?
(注:parquet格式文档解释了即时语义和本地时间语义之间的区别。)
暂无答案!
目前还没有任何答案,快来回答吧!