Hive/Impala:将查询参数$1转小写后执行SHOW TABLES LIKE语句
解决Hive/Impala中参数转小写后执行
SHOW TABLES LIKE的问题 你遇到的核心问题是:lower()是SQL函数,但SHOW TABLES LIKE需要的是字面量字符串,直接在引号里嵌套函数会被当成普通文本处理,无法实现变量转小写的效果。下面分两种常见场景给出具体解决方法:
1. 在Shell脚本中调用Hive/Impala(最常用场景)
如果$1是Shell脚本的位置参数,直接在Shell层面先把参数转成小写,再传入SQL语句即可:
方法A:Bash内置语法(Bash 4.0+支持)
利用Bash的${变量,,}语法直接转小写,简洁高效:
# Hive调用示例 hive -e "SHOW TABLES LIKE '${1,,}';" # Impala调用示例 impala-shell -q "SHOW TABLES LIKE '${1,,}';"
方法B:tr命令兼容旧版Bash
如果你的Bash版本低于4.0,用tr命令做大小写转换:
# 先把参数转成小写 LOWER_PATTERN=$(echo "$1" | tr '[:upper:]' '[:lower:]') # Hive调用 hive -e "SHOW TABLES LIKE '$LOWER_PATTERN';" # Impala调用 impala-shell -q "SHOW TABLES LIKE '$LOWER_PATTERN';"
2. 在HiveQL脚本内部处理参数(通过-d传参)
如果是通过hive -d TABLE_PATTERN=$1 -f script.hql这种方式传参,可以借助元数据表information_schema.tables实现(因为SHOW TABLES无法直接嵌套函数):
# 先将传入的变量转成小写 SET hivevar:lower_pattern=lower('${TABLE_PATTERN}'); # 查询当前库中匹配小写模式的表 SELECT table_name FROM information_schema.tables WHERE table_schema = current_database() AND lower(table_name) LIKE '${lower_pattern}';
注:Hive 0.13+、Impala均支持查询
information_schema.tables,这种方式等价于SHOW TABLES LIKE的效果,同时能实现大小写转换。
为什么你的尝试无效?
当你写SHOW TABLES LIKE 'lower($1)';时,Hive/Impala会把lower($1)直接当成一个固定字符串去匹配表名,而不会执行lower()函数转换变量值,所以自然无法匹配到目标表。
内容的提问来源于stack exchange,提问作者Kiran Das
相关产品推荐
相关产品推荐

