You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:03:04