dataframe - spark在写入json时截断时间戳
问题描述
当将 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
这是预期的行为吗?
解决方案
是的,这是预期的行为!
当我们timestamp type
在将 json 文件写入 HDFS 位置时转换为时,火花会截断并仅保留3 digits in millisecs
.
如何在不截断的情况下获取列值?
向 HDFS投射string type
和写入数据。
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 文件时,连接 dt + ms
字段以重新创建您的original timestamp
值。
推荐阅读
- reactjs - React.js - 如何在没有道具钻孔的情况下将事件处理程序传递给深度嵌套的组件?
- excel - 搜索值并返回相邻单元格
- ruby-on-rails - 在 options_from_collection_for_select 中过滤一个集合
- c++ - 将 std::async 与 future 作为成员一起使用时出现死锁
- ruby-on-rails - 我收到一个寻找文件 /sw/js 的 GET 请求的 RoutingError
- node.js - 使用 AWS 部署 Node 时遇到问题
- c# - 在文本框中过滤winform中的listview
- c# - Google Reporting API V4 缺失值
- typescript - Jest 和 Typescript:构造函数 super () 上未涵盖的分支
- python - 愚蠢的问题:如何在以下情况下替换或去除python中的单引号