PySpark to_date函数解析年第1周返回null问题咨询
现象原因
该返回结果不属于to_date函数的bug,核心是格式符使用不匹配、对Spark的周解析规则不熟悉导致的:
- Spark的日期解析默认遵循Java SimpleDateFormat的规则,首先要区分两个易混的年份格式符:
yyyy:代表自然公历年,即每年1月1日到12月31日的年度计数ww:代表年内周序号,默认每周以周日为起始日,每年第1周定义为「包含当年1月1日的那一周」
- 仅传入年+周两个字段解析时,解析器会默认取对应周的起始日(周日)作为返回日期,再校验该日期的自然年是否和传入的
yyyy值一致,不一致就返回null。
结合给出的测试用例可以逐一验证规则匹配逻辑:
- 2013年第1周包含2013-01-01(周二),当周的周日是2012-12-30,属于2012自然年,和传入的
yyyy=2013不匹配,返回null - 2013年第2周的周日是2013-01-06,属于2013自然年,匹配成功返回对应日期
- 2017年1月1日恰好是周日,是2017年第1周的起始日,属于2017自然年,匹配成功返回2017-01-01
- 2018年第1周包含2018-01-01(周一),当周的周日是2017-12-31,属于2017自然年,和传入的
yyyy=2018不匹配,返回null
正确使用方式
- 按年-周维度解析日期时,不要用自然年
yyyy搭配周数ww,应当使用专门的周年份格式符YYYY(即按周计数的年度,跨年周归属到周内天数占比更高的自然年)。 - 仅传年+周会默认取周起始日,很容易出现跨年匹配问题,建议搭配星期格式符明确指定周内的具体日期,比如要取每周周一作为对应日期,可以使用格式串
YYYY-ww-u,其中u代表周几,取值1为周一、7为周日。
内容的提问来源于stack exchange,提问作者Chogg
相关产品推荐
相关产品推荐

