Spark中to_timestamp转换需保留毫秒末尾零的技术问询
问题解决:Spark中Timestamp类型保留三位毫秒显示
核心问题解析
Spark的Timestamp类型本质是存储时间数值(精确到微秒/纳秒),本身并不携带格式信息。你看到的2023-05-03 00:00:00是默认的显示格式,而非类型本身丢失了毫秒位——实际上to_timestamp转换后的Timestamp值,已经包含了毫秒级精度(即使是.000)。
解决方案
1. 调整Spark的日期时间显示配置
通过修改Spark会话配置,让Timestamp类型在输出时默认显示三位毫秒:
// Scala代码中设置会话配置 spark.conf.set("spark.sql.datetime.java8API.enabled", true) spark.conf.set("spark.sql.timestampType", "TIMESTAMP_NTZ") // Spark 3.0+可选,使用无时区时间戳
或者直接在SQL中设置:
SET spark.sql.datetime.java8API.enabled = true;
修改配置后重新运行测试代码:
spark.sql("select '2023-05-03T00:00:00.000' as string_date, date_format('2023-05-03T00:00:00','yyyy-MM-dd HH:mm:ss.SSS') as date_formatted,to_timestamp(date_format('2023-05-03T00:00:00','yyyy-MM-dd HH:mm:ss.SSS'),'yyyy-MM-dd HH:mm:ss.SSS') as t").show(truncate=False)
输出的t列会显示为2023-05-03 00:00:00.000。
2. 数据校验的正确姿势
如果校验需求是对比时间是否一致,无需纠结显示格式——只要两个Timestamp类型的数值相等,就代表时间完全相同。例如:
SELECT to_timestamp('2023-05-03 00:00:00.000') = to_timestamp('2023-05-03 00:00:00') AS is_equal;
结果会返回true,因为两者的时间数值完全一致。
测试验证
调整配置后的输出示例:
+-----------------------+-----------------------+-----------------------+ |string_date |date_formatted |t | +-----------------------+-----------------------+-----------------------+ |2023-05-03T00:00:00.000|2023-05-03 00:00:00.000|2023-05-03 00:00:00.000| +-----------------------+-----------------------+-----------------------+
内容的提问来源于stack exchange,提问作者Rozan Mhrzn
相关产品推荐
相关产品推荐

