在 pyspark 中将时间戳转换为纪元毫秒

Rom*_*Die 7 python apache-spark apache-spark-sql pyspark

我有一个如下所示的数据集:

纪元秒数 等值时间
1636663343887 2021-11-12 02:12:23

现在,我试图将 转换eq_timeepoch秒,它应该与第一列的值匹配,但我无法这样做。下面是我的代码:

df = spark.sql("select '1636663343887' as epoch_seconds")
df1 = df.withColumn("eq_time", from_unixtime(col("epoch_seconds") / 1000))

df2 = df1.withColumn("epoch_sec", unix_timestamp(df1.eq_time))
df2.show(truncate=False)   
Run Code Online (Sandbox Code Playgroud)

我得到如下输出:

纪元秒数 等值时间 纪元秒
1636663343887 2021-11-12 02:12:23 1636663343

也尝试过这个链接,但没有帮助。我的expected输出是第一列和第三列应该相互匹配。

PS:我Spark 3.1.1在本地使用该版本,而它是Spark 2.4.3在生产中,我的最终目标是在生产中运行它。

bla*_*hop 6

当您将纪元转换为 Spark 时间戳类型时,使用to_timestamp而不是from_unixtime保留毫秒部分。

然后,要返回以毫秒为单位的时间戳,您可以使用函数或强制转换为 long 类型,并将结果与​​使用模式unix_timestamp获得的时间戳的秒分数部分连接起来:date_formatS

import pyspark.sql.functions as F

df = spark.sql("select '1636663343887' as epoch_ms")

df2 = df.withColumn(
    "eq_time",
    F.to_timestamp(F.col("epoch_ms") / 1000)
).withColumn(
    "epoch_milli",
    F.concat(F.unix_timestamp("eq_time"), F.date_format("eq_time", "S"))
)

df2.show(truncate=False)
#+-------------+-----------------------+-------------+
#|epoch_ms     |eq_time                |epoch_milli  |
#+-------------+-----------------------+-------------+
#|1636663343887|2021-11-11 21:42:23.887|1636663343887|
#+-------------+-----------------------+-------------+ 
Run Code Online (Sandbox Code Playgroud)

  • @whatsinthename 我们不在同一时区;) (2认同)