如何使用PySpark将1910-01-01 00:03:01.5转换为毫秒数值
PySpark 时间字符串转毫秒时间戳实现方案
方案1:内置函数实现(推荐,性能最优)
直接使用PySpark官方提供的日期处理函数完成转换,无需自定义逻辑,适合大数据量处理场景,支持1970年之前的时间转换。
实现逻辑
- 第一步:用
to_timestamp函数将字符串格式的时间转换为Timestamp类型,需指定和输入匹配的格式串yyyy-MM-dd HH:mm:ss.S - 第二步:用
unix_timestamp函数将Timestamp转换为秒级时间戳,乘以1000得到整秒对应的毫秒值 - 第三步:用
millisecond函数提取Timestamp的毫秒部分,和上一步结果相加得到最终的毫秒级时间戳
可运行示例代码
from pyspark.sql import SparkSession from pyspark.sql.functions import to_timestamp, unix_timestamp, millisecond, col # 初始化Spark会话 spark = SparkSession.builder.appName("time_convert").getOrCreate() # 构造测试数据 test_df = spark.createDataFrame([("1910-01-01 00:03:01.5",)], ["time_str"]) # 执行转换 result_df = test_df.withColumn( # 转成Timestamp类型 "ts", to_timestamp(col("time_str"), "yyyy-MM-dd HH:mm:ss.S") ).withColumn( # 计算毫秒时间戳 "ms_ts", unix_timestamp(col("ts")) * 1000 + millisecond(col("ts")) ) # 输出结果 result_df.show(truncate=False)
运行后输出的ms_ts字段就是对应的毫秒数值,1910年的时间结果为负数属于正常现象,因为UNIX时间戳以1970-01-01 00:00:00 UTC为零点,零点之前的时间统一返回负数值。
方案2:自定义UDF实现(兼容性好)
如果使用的PySpark版本较低不支持millisecond函数,可以用自定义UDF结合Python的datetime库实现,适合小数据量或者特殊格式的时间处理场景。
可运行示例代码
from pyspark.sql import SparkSession from pyspark.sql.functions import udf, col from datetime import datetime # 初始化Spark会话 spark = SparkSession.builder.appName("time_convert_udf").getOrCreate() # 构造测试数据 test_df = spark.createDataFrame([("1910-01-01 00:03:01.5",)], ["time_str"]) # 定义转换UDF @udf("long") def convert_to_ms(time_str: str) -> int: dt = datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S.%f") return int(dt.timestamp() * 1000) # 执行转换 result_df = test_df.withColumn("ms_ts", convert_to_ms(col("time_str"))) # 输出结果 result_df.show(truncate=False)
注意事项
- 时区处理:如果输入的时间字符串属于特定时区,需提前设置Spark会话时区避免偏移,例如设置东八区可以执行
spark.conf.set("spark.sql.session.timeZone", "Asia/Shanghai") - 格式兼容:如果输入时间的毫秒位数不固定(1位到3位都有),可以将格式串修改为
yyyy-MM-dd HH:mm:ss[.SSS],方括号包裹的部分为可选匹配项。
内容的提问来源于stack exchange,提问作者Mareena Francis
相关产品推荐
相关产品推荐

