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

标签 python apache-spark pyspark apache-spark-sql

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


epoch_seconds
eq_time


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)   
我得到如下输出:


epoch_seconds
eq_time
epoch_sec


1636663343887
2021-11-12 02:12:23
1636663343


我试过 this link as well但没有帮助。我的 expected输出是第一列和第三列应该相互匹配。
附注 : 我正在使用 Spark 3.1.1本地版本,而它是 Spark 2.4.3在生产中,我的最终目标是在生产中运行它。

最佳答案

使用 to_timestamp 而不是 from_unixtime在将纪元转换为 Spark 时间戳类型时保留毫秒部分。
然后,要以毫秒为单位返回时间戳,您可以使用 unix_timestamp函数或通过强制转换为 long 类型,并将结果与​​您使用 date_format using pattern S 获得的时间戳的秒数部分连接起来。 :

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|
#+-------------+-----------------------+-------------+ 

关于python - 在pyspark中将时间戳转换为纪元毫秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69957212/

相关文章:

python - 确保如果两个语句之一失败,则两个语句的最终结果不会发生变化

python - Django 是否具有 Rails 的 “rails db:seed” 的等价物?

python - NumPy 是否搞乱了 CX_Freeze?

scala - Spark提交,如何读取用户输入参数?

python - 使用 PySpark 进行高效的文本预处理(清理、标记化、停用词、词干提取、过滤)

python - PySpark 在每个 DataFrame 行上执行普通 Python 函数

hadoop - 如何从 pyspark rdd 或分区确定原始 s3 输入文件名

c++ - 在一个 Protocol Buffer 二进制文件中存储多条消息

java - Pyspark套接字连接

pyspark - 如何在 GCS 中的增量表之上创建 BQ 外部表并仅显示最新快照