【发布时间】:2020-09-17 23:13:37
【问题描述】:
有没有办法将带有纳秒的时间戳值转换为 spark 中的时间戳。我从 csv 文件中获取输入,并且 timstamp 值的格式为
12-12-2015 14:09:36.992415+01:00。这是我试过的代码。
val date_raw_data = List((1, "12-12-2015 14:09:36.992415+01:00"))
val dateraw_df = sc.parallelize(date_raw_data).toDF("ID", "TIMESTAMP_VALUE")
val ts = unix_timestamp($"TIMESTAMP_VALUE", "MM-dd-yyyy HH:mm:ss.ffffffz").cast("double").cast("timestamp")
val date_df = dateraw_df.withColumn("TIMESTAMP_CONV", ts).show(false)
输出是
+---+-----------------------+---------------------+
|ID |TIMESTAMP_VALUE |TIMESTAMP_CONV |
+---+-----------------------+---------------------+
|1 |12-12-2015 14:09:36.992|null |
+---+-----------------------+---------------------+
我能够使用MM-dd-yyyy HH:mm:ss.SSS 格式转换以毫秒为单位的时间戳。问题在于纳秒和时区格式。
【问题讨论】:
-
更正了 TIMESTAMP_CONV 列上的输出为空,表示转换失败。
-
您可以尝试将自定义架构提供给 CSV,并将列值作为时间戳
-
我尝试使用自定义模式`import org.apache.spark.sql.types._; val customSchema = StructType( Seq(StructField("ID", DataTypes.IntegerType, true), StructField("TIMESTAMP_VALUE", DataTypes.TimestampType, true) ) ); ` 但是现在我得到错误 java.lang.ClassCastException: scala.Tuple2 cannot be cast to java.lang.Integer
-
也许我应该提到我使用的是 spark 1.6
-
为什么不 TimeUnit.NANOSECONDS.convert(time, TimeUnit.MILLISECONDS) ????
标签: datetime apache-spark apache-spark-sql