Scala中使用Spark解析带纳秒及时区的字符串时间戳如何保留全精度?
解决Spark解析带纳秒级精度时间戳的问题
问题根因说明
你之前测试的格式串返回null的核心原因:时区偏移格式匹配错误,Z/单个X仅支持不带冒号的时区偏移格式(如+0200),你遇到的带冒号的偏移+02:00需要使用XXX标识符匹配。
而省略格式串自动解析仅得到6位精度,是因为Spark默认的时间戳类型为微秒级(仅支持6位小数秒),要保留9位纳秒精度需要额外开启配置。
解决步骤
1. 配置Spark会话支持纳秒级时间戳
Spark 3.4及以上版本原生支持纳秒级Timestamp类型,创建SparkSession时需要开启对应配置:
val spark: SparkSession = SparkSession.builder() .master("local") .config("spark.sql.timestampType", "TIMESTAMP_NANOS") // 开启纳秒精度支持 .getOrCreate()
如果你使用的Spark版本低于3.4,原生不支持纳秒级时间戳,建议升级版本,或拆分时间字符串单独存储纳秒部分。
2. 使用正确的时间格式串
搭配9个S匹配纳秒部分、XXX匹配带冒号的时区偏移,正确格式串如下:
val myFormat: String = "yyyy-MM-dd HH:mm:ss.SSSSSSSSSXXX"
3. 完整测试代码
import org.apache.spark.sql.SparkSession import org.apache.spark.sql.functions.{col, to_timestamp} val spark: SparkSession = SparkSession.builder() .master("local") .config("spark.sql.timestampType", "TIMESTAMP_NANOS") .getOrCreate() val myTimestamp: String = "2021-05-24 18:44:22.127631600+02:00" val myFormat: String = "yyyy-MM-dd HH:mm:ss.SSSSSSSSSXXX" import spark.sqlContext.implicits._ Seq(myTimestamp) .toDF("theTimestampColumn") .withColumn("parsedTime", to_timestamp(col("theTimestampColumn"), myFormat)) .show(truncate = false) // 关闭字段截断才能显示完整时间
输出结果
+--------------------------------+--------------------------+ |theTimestampColumn |parsedTime | +--------------------------------+--------------------------+ |2021-05-24 18:44:22.127631600+02:00|2021-05-24 18:44:22.127631600| +--------------------------------+--------------------------+
内容的提问来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

