如何在PySpark中从给定日期字段提取对应的星期几
PySpark 从日期字段提取星期几的实现说明
现有代码正确性验证
你写的实现代码是完全正确的:
dt = dt.withColumn("week_day_number", date_format(col("TRANSACTION_DATE"), "u"))
其中格式符u对应ISO 8601标准的星期计数规则:1代表周一,2代表周二,依次类推,7代表周日,符合大部分业务场景的星期计数要求。
其他可选实现方式
根据不同的业务需求,还有以下几种常用实现:
- 使用原生
dayofweek函数
不需要记忆格式符,写法更直观,注意该函数默认计数规则和ISO标准不同:1代表周日,2代表周一,7代表周六,如果需要对齐ISO标准可做简单偏移处理:from pyspark.sql.functions import dayofweek, when # 原生规则输出 dt = dt.withColumn("week_day_number", dayofweek(col("TRANSACTION_DATE"))) # 调整为ISO标准(周一=1,周日=7) dt = dt.withColumn("week_day_number", when(dayofweek(col("TRANSACTION_DATE")) == 1, 7) .otherwise(dayofweek(col("TRANSACTION_DATE")) - 1) ) - 提取星期文本名称
如果需要输出星期的文字名称,可调整date_format的格式符实现:# 输出英文全称,如 Monday、Sunday dt = dt.withColumn("week_day_en_full", date_format(col("TRANSACTION_DATE"), "EEEE")) # 输出英文缩写,如 Mon、Sun dt = dt.withColumn("week_day_en_short", date_format(col("TRANSACTION_DATE"), "EEE")) # 输出中文名称,需确保Spark会话的locale配置为zh_CN dt = dt.withColumn("week_day_cn", date_format(col("TRANSACTION_DATE"), "EEEE"))
性能说明
以上几种实现的底层都是调用Spark原生的日期处理算子,运行效率没有明显差异。如果你的业务只需要ISO标准的数字星期值,你当前的写法已经是最优方案,简洁且可读性高。
内容的提问来源于stack exchange,提问作者MASSARATA COULIBALY
相关产品推荐
相关产品推荐

