Hive查询中如何将'yyyy-m-dd'格式字符串日期转为'yyyy-mm-dd'格式
Hive非标准日期字符串转换解决方案
你当前转换语句失效的核心问题是:Hive日期格式符中月份对应的标识符是大写M,小写m代表的是分钟,你使用的'yyyy-m-dd'格式和实际日期结构完全不匹配,会直接返回null,也可能引发全表扫描时的异常重试,导致语句长时间无法结束。
正确转换步骤
- 第一步:先测试基础转换逻辑,加limit验证语句可正常执行
测试代码:select unix_timestamp(bad_date, 'yyyy-M-dd') from mytable limit 10; - 第二步:如果需要生成带前置零的标准日期字符串,方便后续直接按字符串排序得到正确结果,嵌套
from_unixtime做格式转换即可:
转换代码:
转换后得到的select from_unixtime(unix_timestamp(bad_date, 'yyyy-M-dd'), 'yyyy-MM-dd') as standard_date from mytable;standard_date为2021-09-01这类标准格式,直接按字符串排序也能正确识别10月大于9月,不需要每次查询都做时间戳转换。 - 第三步:如果仅需要临时比较取最大日期,直接在排序逻辑中调用转换函数即可:
取最大日期行代码:select * from mytable order by unix_timestamp(bad_date, 'yyyy-M-dd') desc limit 1;
异常排查说明
- 若转换后返回null,可先通过正则过滤脏数据后再转换:
where bad_date rlike '^[0-9]{4}-[0-9]{1,2}-[0-9]{2}$',排除缺少年月日、存在非数字字符的异常行。 - 若全量查询仍卡顿,可先合并表的小文件,或根据集群资源调整查询并行度:
set mapreduce.job.reduces=合适的reduce数量。
内容的提问来源于stack exchange,提问作者user3486773
相关产品推荐
相关产品推荐

