【发布时间】:2018-10-12 17:34:07
【问题描述】:
我有毫秒格式的时间戳,需要将它们从系统时间转换为 UTC。无论如何...在进行转换时,火花会吞噬我的毫秒数,并将它们显示为零。
简短示例:
from pyspark import Row
from pyspark import SparkContext
from pyspark.sql.functions import to_timestamp, date_format
spark = SparkContext.getOrCreate()
test = spark.createDataFrame([Row(timestamp = "2018-03-24 14:37:12,133")])
test_2 = test.withColumn('timestamp_2', to_timestamp('timestamp', 'yyyy-MM-dd HH:mm:ss,SSS'))
test_3 = test_2.withColumn('timestamp_3', date_format('timestamp_2', 'yyyy-MM-dd HH:mm:ss,SSS'))
test_3.write.option('header', True).csv('something')
这将导致:
timestamp,timestamp_2,timestamp_3
"2018-03-24 14:37:12,133",2018-03-24T14:37:12.000+01:00,"2018-03-24 14:37:12,000"
我能以某种方式保留毫秒吗?
我使用的是 python 3.6.4 和 spark 版本 2.3.2。
【问题讨论】:
-
显然这只是
to_timestamp所做的事情。我不知道他们为什么要这样设计,Python docs 和 Scala docs 都没有意义; Python 文档说它正在转换为 DateType,这比你看到的更没有意义,而 Scala 文档在to_timestamp的描述中奇怪地破坏了英语。 -
Scala 文档至少说“以秒为单位”,但没有说明为什么 TimestampType 具有比这更高的分辨率时会以秒为单位。他们也说“Unix时间戳”,但是当输出格式是TimestampType而不是Unix时间戳时,这也没有多大意义。
-
好的。您是否知道一个不太难看的解决方案,以便我可以将其转换为时间戳? :)
-
你的 SQL 后端是什么?这一定是它的时间戳类型或其他东西的限制。
标签: python apache-spark pyspark