我的数据源提供纳秒的时间戳。理想情况下我喜欢保留这个,但是需要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不支持?
谢谢!
答案 0 :(得分:0)
如果要使用纳秒精度时间戳,则应在数据帧中将它们保留为BIGINT
/ LongType
,并在需要执行非显而易见的操作时将它们转换为Spark时间戳,例如,时区转换。这样,可以快速有效地执行范围过滤等常见操作,而不会降低精度。
如果您需要对这些不易通过Spark处理的时间戳执行常见操作,您可以创建自己的UDF和/或Dataset[A]
暗示。在Swoop,我们在涉及与时间相关的数据时会做很多事情,例如,启用分区过滤(时间格式为yyyyMMddhhmm
)或暴露复杂的操作,例如按周分组。