Spark SQL中从字符串日期时间提取年份的问题咨询
解决Spark SQL提取dd/MM/yyyy格式日期年份的问题
首先得指出你当前查询里的几个关键问题,然后给你正确的实现方案:
你的查询存在的问题
- 日期类型不匹配:你的
dt字段是dd/MM/yyyy格式的字符串,但Spark的year()函数只接受Date或Timestamp类型的输入。直接对字符串调用year()会导致解析失败(因为Spark默认按yyyy-MM-dd解析日期),最终返回null,自然筛选不到任何数据。 - WHERE子句语法与逻辑错误:
- 你想筛选2018或2019年的记录,却用了
AND,这会导致没有任何数据满足条件(一个日期不可能同时属于两年)。 year(dt=='2019')是完全错误的语法,dt=='2019'返回的是布尔值,year()无法处理布尔类型的输入。
- 你想筛选2018或2019年的记录,却用了
正确的解决方案
核心思路是先把字符串格式的dt转换为Spark认可的日期类型,再提取年份进行筛选。这里有两种可靠的写法:
方法1:使用to_date()转换日期后筛选
SELECT * FROM T1 WHERE year(to_date(dt, 'dd/MM/yyyy')) IN (2018, 2019);
to_date(dt, 'dd/MM/yyyy'):将字符串dt按照dd/MM/yyyy的格式转换为Date类型。year(...):从转换后的日期中提取年份(整数类型)。IN (2018, 2019):简洁地指定要筛选的年份范围,效果等价于year(...) = 2018 OR year(...) = 2019。
方法2:直接提取日期字符串的年份(应急可用,不推荐)
如果因为某些原因无法转换日期类型,可以直接截取dt字符串的最后4位(因为格式是dd/MM/yyyy,年份在末尾):
SELECT * FROM T1 WHERE substring(dt, 7, 4) IN ('2018', '2019');
⚠️ 注意:这种方法仅适用于dt格式严格符合dd/MM/yyyy的场景,如果存在格式不规范的数据(比如少一位、分隔符错误),会得到错误的结果。优先推荐方法1。
内容的提问来源于stack exchange,提问作者UgoL
相关产品推荐
相关产品推荐

