Hive执行Shell脚本嵌套for循环报错,请求排查解决
Hive脚本批量导出表DDL报错排查
问题详情
尝试编写Shell脚本批量导出Hive数据库中所有表的DDL,但运行报错。
脚本代码
#!/bin/bash rm -f DDL_table_names.txt declare -a db_name=("dev_cmt" "dev_cmt_fleet") for DB in "${db_name[@]}" do echo "$DB:">> DDL_table_names.txt for Tab in "$DB" do hive -e "use $DB;show create table $Tab;">>DDL_table_names.txt echo -e "\n" >> DDL_table_names.txt done done echo "Table file generated"
报错信息
FAILED: SemanticException [Error 10001]: Table not found dev_cmt
报错原因及修复方案
核心问题:内层循环
for Tab in "$DB"只是把当前数据库名作为唯一的“表名”来遍历,并没有真正获取该数据库下的所有表。执行show create table $Tab时,实际是在查找名为dev_cmt的表(而非dev_cmt库下的表),所以触发“表不存在”的错误。修复后的脚本:
#!/bin/bash rm -f DDL_table_names.txt declare -a db_name=("dev_cmt" "dev_cmt_fleet") for DB in "${db_name[@]}" do echo "$DB:">> DDL_table_names.txt # 获取当前数据库下的所有表名,屏蔽Hive的错误输出 tables=$(hive -e "use $DB; show tables;" 2>/dev/null) # 遍历每个表名 for Tab in $tables do hive -e "use $DB;show create table $Tab;">>DDL_table_names.txt echo -e "\n" >> DDL_table_names.txt done done echo "Table file generated"
- 优化建议:
- Hive执行
show tables时会输出"OK"和"Time taken"等无关行,可通过过滤清理:tables=$(hive -e "use $DB; show tables;" 2>/dev/null | grep -v "OK" | grep -v "Time taken") - 可增加空表判断,当数据库无表时输出提示到文件,避免内容缺失:
if [ -z "$tables" ]; then echo "No tables found in database $DB" >> DDL_table_names.txt fi
- Hive执行
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

