PySpark将timestamp转换为epoch毫秒值时数值不匹配求解
问题原因
from_unixtime默认输出格式为yyyy-MM-dd HH:mm:ss,会直接截断传入时间参数的毫秒部分,你的eq_time字段从生成阶段就丢失了毫秒信息,自然无法转回原数值unix_timestamp函数返回的是秒级时间戳,返回结果本身就不包含毫秒位,直接使用只会得到10位秒级数值
兼容Spark 2.4.3的解决方案
你需要在日期转字符串阶段保留毫秒位,转回时通过timestamp类型乘1000得到毫秒级时间戳,参考代码如下:
from pyspark.sql.functions import col, from_unixtime df = spark.sql("select '1636663343887' as epoch_seconds") # 生成eq_time时指定带毫秒的格式,保留完整时间精度 df1 = df.withColumn("eq_time", from_unixtime(col("epoch_seconds") / 1000, "yyyy-MM-dd HH:mm:ss.SSS")) # 先转成timestamp类型再乘1000,得到毫秒级时间戳 df2 = df1.withColumn("epoch_sec", (col("eq_time").cast("timestamp") * 1000).cast("long")) df2.show(truncate=False)
注意事项
如果你的eq_time字段是已经存储好、且本身不包含毫秒位的字符串,那么丢失的毫秒信息无法逆向恢复,必须在第一次将时间戳转换为字符串的环节就保留毫秒位。
内容的提问来源于stack exchange,提问作者whatsinthename
相关产品推荐
相关产品推荐

