Hive表yyyyMMdd格式字符串日期列按区间统计记录数方法
Hive 字符串格式日期列区间查询解决方案
你的原始查询结果异常的核心原因是:未加引号的20210101属于数值类型,Hive会将string类型的date列隐式转换为数值进行比较,出现异常值时会生成null,导致统计结果不符合预期。你可以通过以下三种方式实现正确的区间统计:
- 方法1:高版本Hive(2.1+)直接转DATE类型查询
Hive 2.1及以上版本的to_date函数支持直接指定输入日期格式,写法最简洁:
注意:BETWEEN为左右闭区间,若需要排除SELECT COUNT(*) FROM table_1 WHERE to_date(date, 'yyyyMMdd') BETWEEN '2021-01-01' AND '2021-03-01';2021-03-01当天的数据,可将条件改为to_date(date, 'yyyyMMdd') >= '2021-01-01' AND to_date(date, 'yyyyMMdd') < '2021-03-01' - 方法2:兼容低版本Hive的DATE转换写法
低版本Hive不支持双参数to_date,可以先通过unix_timestamp解析为时间戳,再转换为DATE类型:SELECT COUNT(*) FROM table_1 WHERE to_date(from_unixtime(unix_timestamp(date, 'yyyyMMdd'))) BETWEEN '2021-01-01' AND '2021-03-01'; - 方法3:直接使用字符串比较(无需类型转换)
由于yyyyMMdd格式的8位字符串的字典排序和日期排序完全一致,只要保证date列所有值都是符合格式的8位字符串,没有异常值、缺省值,也可以直接按字符串类型比较,性能更高:
注意:区间值必须加引号,保证和SELECT COUNT(*) FROM table_1 WHERE date BETWEEN '20210101' AND '20210301';date列的string类型匹配,避免隐式类型转换导致的结果异常。
内容的提问来源于stack exchange,提问作者st789
相关产品推荐
相关产品推荐

