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
相关产品推荐
相关产品推荐

