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

Hive与Spark SQL中DATE_FORMAT周起始不一致的适配方法问询

让Spark SQL周起始与Hive一致(周一为周起始)

方法1:修改SQL语句,使用ISO周格式符

Spark的DATE_FORMAT函数中,uu代表ISO标准周数(周一为周起始),而默认的ww是依赖系统区域的周数(通常周日为起始)。将原语句中的ww替换为uu即可和Hive行为对齐:

DATE_FORMAT(from_unixtime(unix_timestamp(dt, 'yyyyMMdd')), 'Y-uu')

执行该语句后,日期20230611会返回2023-23,与Hive结果一致。

方法2:全局配置Spark会话,强制使用ISO周规则

如果需要所有周相关计算都和Hive对齐,可以在创建SparkSession时添加以下配置,强制周计算遵循ISO标准(周一为起始):

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("HiveCompatibleWeek") \
    .config("spark.sql.legacy.weekOfYearPolicy", "LEGACY") \
    .config("spark.sql.session.timeZone", "Europe/London")  # 匹配en_GB时区
    .enableHiveSupport() \
    .getOrCreate()

配置完成后,原有的Y-ww格式语句就能返回和Hive一致的结果。

方法3:使用WEEKOFYEAR函数指定周起始

Spark 2.3及以上版本的WEEKOFYEAR函数支持第二个参数指定周起始日(1代表周一,2代表周二,...,7代表周日)。可以通过拼接年份和周数实现需求:

CONCAT(
    YEAR(to_date(dt, 'yyyyMMdd')),
    '-',
    LPAD(WEEKOFYEAR(to_date(dt, 'yyyyMMdd'), 1), 2, '0')
)

该语句会将日期转换为年-两位周数的格式,周起始为周一,结果与Hive一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:43:00