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

PySpark年周格式转日期部分失效求助(Azure Databricks环境)

解决方案:Spark解析年周字段(含53/01周)并设置周一为周起始

问题根源

  1. 格式符错误:你使用的"yyyyw"仅支持单数字周数(1-9),当周数为两位(01/53)时,解析规则不匹配,直接返回null。
  2. 周起始日未正确配置:默认Spark周起始为周日,跨年度的周数(如年末53周、年初01周)会因周历规则冲突导致解析失败。

配置前置

先确保会话级配置正确(需在DataFrame操作前执行):

# Python版本
spark.conf.set("spark.sql.week.start", "1")  # 设置周一为周起始日
spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")  # 保留你已有的配置
// Scala版本
spark.conf.set("spark.sql.week.start", "1")
spark.conf.set("spark.sql.legacy.timeParserPolicy", "LEGACY")

方案1:使用ISO周专用函数(推荐)

Spark 3.0+ 提供from_iso_year_week函数,专门处理ISO标准年周格式(yyyyww,如202353),默认以周一为周起始,自动处理跨年度周数的解析:

# Python版本
from pyspark.sql.functions import from_iso_year_week, col

week_df = week_df.withColumn("date", from_iso_year_week(col("BIC_YCALWK_TO").cast("string")))
// Scala版本
import org.apache.spark.sql.functions.{from_iso_year_week, col}

val week_df = week_df.withColumn("date", from_iso_year_week(col("BIC_YCALWK_TO").cast(StringType)))

该函数会直接返回对应周的周一日期,完全符合需求。

方案2:修正格式符后使用to_date

如果坚持使用to_date,需将格式符改为"yyyyww"(支持两位周数),结合前置配置即可正确解析:

# Python版本
from pyspark.sql.functions import to_date, col

week_df = week_df.withColumn("date", to_date(col("BIC_YCALWK_TO").cast("string"), "yyyyww"))
// Scala版本
import org.apache.spark.sql.functions.{to_date, col}

val week_df = week_df.withColumn("date", to_date(col("BIC_YCALWK_TO").cast(StringType), "yyyyww"))

验证示例

BIC_YCALWK_TO解析后date(周一为周起始)
2023532023-12-25
2024012024-01-01

内容的提问来源于stack exchange,提问作者Abhra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:32:31