Dataframe spark在写入json时截断时间戳
将Spark数据帧的时间戳列写入JSON时,会截断微秒:Dataframe spark在写入json时截断时间戳,dataframe,apache-spark,timestamp,Dataframe,Apache Spark,Timestamp,将Spark数据帧的时间戳列写入JSON时,会截断微秒: val df=Seq(“2019-09-30 00:08:27.272846”).toDF(“dt”).select(col(“dt”).cast(“时间戳”)) df.show(false)//打印2019-09-30 00:08:27.272846 json(“/tmp/spark/dt”) val dff=spark.read.json(“/tmp/spark/dt”) dff.show(false)//打印2019-09-30T0
val df=Seq(“2019-09-30 00:08:27.272846”).toDF(“dt”).select(col(“dt”).cast(“时间戳”))
df.show(false)//打印2019-09-30 00:08:27.272846
json(“/tmp/spark/dt”)
val dff=spark.read.json(“/tmp/spark/dt”)
dff.show(false)//打印2019-09-30T00:08:27.272Z
这是预期的行为吗
是的,这是预期的行为 在将json文件写入HDFS位置时,当我们转换为时间戳类型时,spark会截断并仅保留3位数(毫秒) 如何在不截断的情况下获取列值? 转换为字符串类型,并将数据写入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)
结果:
+--------------------------+
|dt |
+--------------------------+
|2019-09-30 00:08:27.272846|
+--------------------------+
(或)
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写入HDFS位置,当您再次阅读json文件时,concat
dt+ms
字段将重新创建您的原始时间戳
值。谢谢您的回答@shu。你对此有什么建议吗?似乎很奇怪,写入JSON的行为与写入拼花地板的行为不同。