【问题标题】:Spark Timestamp - Millis and RFC3339 nanoSpark 时间戳 - Millis 和 RFC3339 nano
【发布时间】:2017-06-14 08:06:04
【问题描述】:

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

首先有没有办法在 Spark 中做到这一点?我使用的是 2.11-2.1.1(实际使用的是 databricks 运行时 3.0)

现在我当然想保留毫秒(用于快速事件时间排序) - 如果需要,我可以不用 nanos 精度。

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 不支持?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    如果您想使用纳秒级精度的时间戳,您应该在数据帧中将它们保留为BIGINT/LongType,并且仅在您需要执行非显而易见的操作(例如时区转换)时才将它们转换为 Spark 时间戳。这样,可以快速高效地执行范围过滤等常见操作,而不会损失精度。

    如果您需要对这些无法通过 Spark 轻松处理的时间戳执行常见操作,您可以创建自己的 UDF 和/或 Dataset[A]implicits。在 Swoop,当涉及到与时间相关的数据时,我们经常这样做,例如,启用分区过滤(时间格式为 yyyyMMddhhmm)或公开复杂的操作,例如按周分组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多