PySpark年周格式转日期部分失效求助(Azure Databricks环境)
解决方案:Spark解析年周字段(含53/01周)并设置周一为周起始
问题根源
- 格式符错误:你使用的
"yyyyw"仅支持单数字周数(1-9),当周数为两位(01/53)时,解析规则不匹配,直接返回null。 - 周起始日未正确配置:默认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(周一为周起始) |
|---|---|
| 202353 | 2023-12-25 |
| 202401 | 2024-01-01 |
内容的提问来源于stack exchange,提问作者Abhra
相关产品推荐
相关产品推荐

