Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dataframe spark在写入json时截断时间戳_Dataframe_Apache Spark_Timestamp - Fatal编程技术网

Dataframe 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

将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-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的行为与写入拼花地板的行为不同。