使用beeline执行多个引用相同hive变量的hql文件是否可行?
问题解答
核心结论
可以在单个Hive(beeline)会话中向多个HQL文件传递全局hive变量并批量执行,你给出的写法调整小问题后可以正常运行。
原写法说明
你写的命令:
beeline -u "{$url}" --hivevar FROM=2020 --hivevar TO=2021 -e "$(cat loadTable1.hql loadTable2.hql)"
运行逻辑是通过cat将两个HQL文件的内容按顺序拼接,传入-e参数在同一会话中执行,--hivevar传递的FROM、TO是会话级全局变量,两个文件中引用的${FROM}、${TO}都可以正常识别到赋值,本身逻辑是成立的。
注意原命令有一处小错误:
"{$url}"的变量插值写法错误,应该改为"${url}",否则无法正确读取url变量的值。
注意事项
- 两个HQL文件的末尾必须加语句结束符
;,如果第一个文件最后一行语句没有分号,拼接后会和第二个文件的第一行语句连在一起,触发语法错误。 - 如果HQL文件中存在非变量场景的
$符号(比如正则表达式中的结束符$),需要提前转义为\$,避免被误认为变量占位符触发异常解析。 - 如果HQL文件体积较大,可能会超出shell命令行的参数长度限制,这种场景更推荐使用入口文件的写法:
- 新建总执行入口文件
run_all.hql,写入以下内容:source loadTable1.hql; source loadTable2.hql; - 执行命令修改为:
beeline -u "${url}" --hivevar FROM=2020 --hivevar TO=2021 -f run_all.hql
- 新建总执行入口文件
内容的提问来源于stack exchange,提问作者Ponugundla
相关产品推荐
相关产品推荐

