Spark Timestamp - Millis和RFC3339 nano

时间:2017-06-14 08:06:05

标签: apache-spark apache-spark-sql spark-dataframe

我的数据源提供纳秒的时间戳。理想情况下我喜欢保留这个,但是需要RFC3339对TimestampType的支持,我不认为它是(或者是它!)

首先有一种方法可以在Spark中执行此操作吗?我正在使用2.11-2.1.1(实际使用databricks runtime 3.0)

现在我当然希望保留millis(用于快速事件时间排序) - 如果需要,我可以没有纳米精度。

val orderPlacedTimestampDF = Seq(
  ("orderPlacedDate", "2017-06-13T14:23:49.357Z")).toDF("field", "date")

val orderPlacedTimestampConvertedDF = 
   orderPlacedTimestampDF.select($"field", $"date", unix_timestamp($"date", "yyyy-MM-dd'T'HH:mm:ss.SSS").cast(TimestampType).as("timestamp"))

display(orderPlacedTimestampConvertedDF)


'2017-06-13T14:23:49.357Z' gets converted to '2017-06-13T14:23:49.000+0000'

(注意:如果我将'Z'添加到模式中,我会返回null!)

任何帮助表示赞赏

请注意格式字符串上的“.SSS”后缀。但是,这只返回与没有.SSS的格式字符串相同。

我在这里遗漏了什么,或者是否更好地进行此转换,或者TimestampType不支持?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果要使用纳秒精度时间戳,则应在数据帧中将它们保留为BIGINT / LongType,并在需要执行非显而易见的操作时将它们转换为Spark时间戳,例如,时区转换。这样,可以快速有效地执行范围过滤等常见操作,而不会降低精度。

如果您需要对这些不易通过Spark处理的时间戳执行常见操作,您可以创建自己的UDF和/或Dataset[A]暗示。在Swoop,我们在涉及与时间相关的数据时会做很多事情,例如,启用分区过滤(时间格式为yyyyMMddhhmm)或暴露复杂的操作,例如按周分组。