写入json时,spark会截断时间戳

时间:2019-10-02 14:19:56

标签: dataframe apache-spark timestamp

在将Spark DataFrame的时间戳列写入JSON微秒时被截断:

val df = Seq("2019-09-30 00:08:27.272846").toDF("dt").select(col("dt").cast("timestamp"))
df.show(false) // prints 2019-09-30 00:08:27.272846
df.write.json("/tmp/spark/dt")
val dff = spark.read.json("/tmp/spark/dt")
dff.show(false) // prints 2019-09-30T00:08:27.272Z

这是预期的行为吗?

https://www.zepl.com/viewer/notebooks/bm90ZTovL2R2aXJ0ekBnbWFpbC5jb20vNGFkZGI1ZDEyZTFlNDJmNTkwMzIyNDg1ODc3ZGI0ZTUvbm90ZS5qc29u

1 个答案:

答案 0 :(得分:0)

是的,这是预期的行为!

当我们在将json文件写入HDFS位置时投射到 timestamp type 时,火花会被截断并仅保留 3 digits in millisecs

  

如何在不截断的情况下获取列值?

投射到 string type 并将数据写入HDFS。

val df = Seq("2019-09-30 00:08:27.272846").toDF("dt").select(col("dt").cast("string"))
df.write.json("/tmp/spark/dt")
val dff = spark.read.json("/tmp/spark/dt")
dff.show(false)

Result:

+--------------------------+
|dt                        |
+--------------------------+
|2019-09-30 00:08:27.272846|
+--------------------------+

(or)

val df = Seq("2019-09-30 00:08:27.272846").toDF("dt").select(col("dt").cast("timestamp"))

//add new column to get last 3 digits from dt column

val df1 = df.withColumn("ms",expr("substring(dt,-3)")).show(false)

然后以json格式写入 df1 to HDFS 位置,当您再次读取json文件时 concat dt + ms 字段重新创建您的 original timestamp 值。