Hive分区表获取上月数据失败求助:SQL查询返回空结果
解决Hive分区查询返回空结果的问题
看起来你的问题大概率出在月份的格式匹配上,咱们一步步拆解分析:
核心问题:月份格式不统一
你当前的代码中,当mth是03时,计算后得到的月份是cast(3-1 as string)也就是'2'——但如果你的month分区字段是两位字符串类型(比如存储的是'02'而不是'2'),这两个值就完全不匹配,自然查不到数据。
另外,建议先执行desc table;确认month和year的字段类型,这会直接影响后续的处理逻辑。
针对性解决方案
情况1:分区字段是字符串类型(最常见)
修改代码,用lpad函数把计算后的月份补成两位格式,确保和分区存储的格式一致:
set hivevar:yr=2019; set hivevar:mth=03; set hivevar:dy=29; SELECT * FROM table WHERE month = case when cast('${mth}' as int) = 1 then '12' -- 用lpad补前导零,保证结果是两位字符串 else lpad(cast(cast('${mth}' as int) - 1 as string), 2, '0') end AND year = case when cast('${mth}' as int) = 1 then cast(cast('${yr}' as int) - 1 as string) else '${yr}' end -- 如果day也是分区字段且需要过滤,加上这行 AND day = '${dy}';
情况2:分区字段是整数类型
如果month和year是int类型,直接用数字运算即可,不需要反复转换字符串:
set hivevar:yr=2019; set hivevar:mth=03; set hivevar:dy=29; SELECT * FROM table WHERE month = case when ${mth} = 1 then 12 else ${mth} - 1 end AND year = case when ${mth} = 1 then ${yr} - 1 else ${yr} end AND day = ${dy};
额外排查步骤
如果修改后还是返回空,建议:
- 执行
show partitions table;查看目标分区是否存在(比如当mth=01时,确认year=2018/month=12/day=29这个分区是否存在) - 手动查询单个分区验证数据,比如
SELECT * FROM table WHERE year='2019' AND month='02' AND day='29';,确认该分区本身有数据
内容的提问来源于stack exchange,提问作者trougc
相关产品推荐
相关产品推荐

