用sqoop解释变量时的bash错误

k2arahey  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(498)

我在bash脚本中向sqoop传递参数时遇到问题。
sqoop是一个将表从rdb(在这个特殊情况下是oracle)传输到hive的工具。它是这样调用的命令行工具:

sqoop import --connect <string> --direct --table <table> --query <query> ....

我在脚本中生成要启动的命令,从文件中获取值并用awk解析它们。
所有参数都可以,除了--query参数。此参数用于传递要在源上用于数据提取的查询。它接受这种格式:

select very long list of columns from schema.table where \$CONDITIONS

$conditions是sqoop替换的一个变量,因此在这种非常文字化的格式中是必需的,包括反斜杠。
我确信问题出在--query参数上,因为如果我按原样运行脚本,但是用纯文本硬编码--query的值,它就可以工作了。
要清楚的是,这是我在脚本中得到的命令:

scoop import --connect "$source" --table "$sourcetab" \
 -- hiveimport --some more other commands --querytot "$query"

所以,我不明白为什么这个值有问题。
到目前为止,我尝试了以下值形式--查询:
鉴于:

query="select col1 col2 col3 col4 col4 from schema.table"

我已经试过了:

1. querytot="$query where \\$CONDITIONS"

2. cond=" where '\$CONDITIONS'"
   querytot="$query$cond"

3. $(echo "$query$cond")   <-- placed directly in the sqoop command

4. echo "$query$cond" > query_file, and passed it to Sqoop via --options-file

所有这些都没有成功。
你能帮帮我吗?我卡住了。
谢谢

nwwlzxa7

nwwlzxa71#

向字符串添加文字后缀的简单方法是在单引号中附加该后缀。
将文档读入sqoop可以非常清楚地看到,查询应该作为单个参数传递,文本后缀应该是 WHERE $CONDITIONS ,在问题中给出的代码中,反斜杠只是用来表示 $ 字面意义的。然而,在单引号中 $ 已经是字面意义上的了--使反斜杠变得不必要。
因此:

query="select col1 col2 col3 col4 col4 from schema.table"
query+=' WHERE $CONDITIONS'

sqoop import --query "$query"

相关问题