如何在Impala查询中设置当前月及上月为列名生成近4个月报表
问题根因
- Impala 的
SET命令仅支持赋值静态字符串,不会执行右侧的函数表达式,你此前的写法中${MONTH1}实际被替换为字符串MONTHNAME(NOW())而非计算后的月份名 - Impala SQL 属于静态解析语言,列别名必须在SQL提交解析前确定为固定值,无法在查询执行过程中动态生成别名
解决方法
方案1:Shell脚本动态生成SQL(生产环境最推荐,适合自动化跑批)
通过Shell层预先计算好月份值,拼接成完整SQL后提交给Impala执行,支持自动生成近4个月的列名,示例代码如下:
# 依次计算近4个月的英文月份名,需要中文可以调整date格式参数 MONTH1=$(date +"%B") MONTH2=$(date -d "-1 month" +"%B") MONTH3=$(date -d "-2 month" +"%B") MONTH4=$(date -d "-3 month" +"%B") # 拼接SQL并执行,列名加反引号避免特殊字符报错 impala-shell -q " SELECT item, SUM(val1) AS \`${MONTH1}\`, SUM(val2) AS \`${MONTH2}\`, SUM(val3) AS \`${MONTH3}\`, SUM(val4) AS \`${MONTH4}\` FROM MyTable GROUP BY item; "
方案2:交互环境手动赋值(适合Hue/Beeline临时查询)
如果是在交互界面手动执行查询,可以先运行函数得到月份值后,再静态赋值给会话变量:
-- 先执行查询得到对应月份名,例如运行 SELECT MONTHNAME(NOW()); 得到结果是October SET MONTH1 = October; SET MONTH2 = September; SET MONTH3 = August; SET MONTH4 = July; -- 执行查询时变量会自动替换为对应的月份作为列名 SELECT item, SUM(val1) AS ${MONTH1}, SUM(val2) AS ${MONTH2}, SUM(val3) AS ${MONTH3}, SUM(val4) AS ${MONTH4} FROM MyTable GROUP BY item;
内容的提问来源于stack exchange,提问作者Aisha
相关产品推荐
相关产品推荐

