PySpark中如何将TimeStamp类型转换为datetime2(7)类型
PySpark Timestamp转datetime2(7)实现方案
问题根因
convert(datetime2, xxx, 7)是SQL Server专属的类型转换语法,Spark SQL没有内置该函数,直接执行会抛出函数不存在的错误,无法得到预期结果。- Spark原生没有
datetime2类型定义,datetime2(7)是SQL Server特有的、精度为100纳秒(7位小数秒)的时间类型,无法在Spark内部直接做类型声明转换。 - 原始Timestamp字段示例值:
2018-01-02 10:00:00
- 无效尝试代码:
df=spark.sql("SELECT convert(datetime2, KeyPromotionStartDate, 7) AS StartDate from df_promotions").show()
对应场景解决方案
场景1:输出符合datetime2(7)格式的时间字符串
如果需要得到和SQL Server datetime2(7)展示格式完全一致的字符串(格式为yyyy-MM-dd HH:mm:ss.SSSSSSS,秒后带7位精度),直接使用Spark内置的日期格式化函数即可:
# PySpark DataFrame API 写法 from pyspark.sql.functions import date_format df = df_promotions.select( date_format("KeyPromotionStartDate", "yyyy-MM-dd HH:mm:ss.SSSSSSS").alias("StartDate") ) df.show() # Spark SQL 写法 df = spark.sql(""" SELECT date_format(KeyPromotionStartDate, 'yyyy-MM-dd HH:mm:ss.SSSSSSS') AS StartDate FROM df_promotions """) df.show()
说明:Spark原生Timestamp类型最高支持微秒级(6位小数秒精度),格式化后第7位小数会自动补0,输出结果完全符合datetime2(7)的格式规范,可直接用于文本导出、接口传参等场景。
场景2:写入SQL Server时映射为datetime2(7)字段
如果需求是将Spark数据写入SQL Server后,对应字段类型为datetime2(7),不需要在Spark侧做额外类型转换,通过JDBC写入参数指定字段类型即可:
- 写入时自动建表的场景,通过
createTableColumnTypes参数指定字段类型:
df_promotions.write \ .format("jdbc") \ .option("url", "SQL Server数据库连接地址") \ .option("dbtable", "目标表名") \ .option("user", "数据库账号") \ .option("password", "数据库密码") \ .option("createTableColumnTypes", "KeyPromotionStartDate DATETIME2(7)") \ .save()
- 往已存在的、字段类型为datetime2(7)的SQL Server表写入数据时,Spark的Timestamp类型可通过SQL Server JDBC驱动自动适配类型,直接写入即可,不需要额外转换。
内容的提问来源于stack exchange,提问作者jacky789
相关产品推荐
相关产品推荐

