Shell脚本执行Hive查询报错:无法识别表名中的$符号
解决Shell脚本中Hive查询的变量替换失败问题
我一看你这个错误就知道是Shell变量解析的问题——你用单引号把Hive命令包起来了,Shell根本不会解析单引号里的变量,导致Hive看到的是${DST_ARCHIVE_TABLE}这种字面量,自然报语法错误。
问题根源
Shell的单引号(' ')是强引用,内部的所有字符都会被当作字面量,不会进行变量替换、命令替换等操作。你的Hive命令被单引号包裹,所以${DST_ARCHIVE_TABLE}、${SRC_TABLE_HIVE}和${current_date}这些变量完全没被替换成实际值,Hive就把它们当成了表名的一部分,这肯定不符合语法规则。
修正方案
有两种简单的方式解决这个问题:
方案1:改用双引号包裹Hive命令
把单引号换成双引号,这样Shell会解析内部的变量,同时注意转义Shell的特殊字符(比如<,因为在双引号里它依然是重定向符号,需要转义成\<):
#!/bin/bash DST_ARCHIVE_TABLE=as400_nat_pp09_siedta_raw_dev.natart_archive SRC_TABLE_HIVE=as400_nat_pp09_siedta_raw_dev.natart_to_process current_date=$(date +%Y%m%d%H%M%S) hive -e "SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; insert into table ${DST_ARCHIVE_TABLE} partition (to_porcess_ts) select * from ${SRC_TABLE_HIVE} where to_porcess_ts \< ${current_date} "
方案2:混合使用单双引号(更安全)
把不需要变量替换的固定Hive语法用单引号包裹,需要替换的变量用双引号单独包裹,然后拼接起来。这种方式能避免双引号里特殊字符的转义问题,更稳妥:
#!/bin/bash DST_ARCHIVE_TABLE=as400_nat_pp09_siedta_raw_dev.natart_archive SRC_TABLE_HIVE=as400_nat_pp09_siedta_raw_dev.natart_to_process current_date=$(date +%Y%m%d%H%M%S) hive -e 'SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; insert into table '"${DST_ARCHIVE_TABLE}"' partition (to_porcess_ts) select * from '"${SRC_TABLE_HIVE}"' where to_porcess_ts < '"${current_date}"' '
额外提醒
我注意到你变量名里有个拼写错误:to_porcess_ts少了一个字母c,应该是to_process_ts。虽然这不是当前报错的原因,但后续可能会导致数据过滤逻辑出错,建议顺手修正。
内容的提问来源于stack exchange,提问作者Zied Hermi
相关产品推荐
相关产品推荐

