在将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
这是预期的行为吗?
答案 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
值。