关于如何在 shell 脚本中运行 impala-shell

Posted

技术标签:

【中文标题】关于如何在 shell 脚本中运行 impala-shell【英文标题】:about how to run impala-shell within a shell script 【发布时间】:2015-04-06 13:55:37 【问题描述】:

我在尝试执行此 bash 代码时遇到问题:

function createImpalaPartition() 

period_id=$1;
database=$2
node=$3

actual_full=$(date -d@"$period_id" +%Y/%m/%d/%H/%M/)
template="use c2d;create EXTERNAL TABLE exptopology_$period_id (child_id bigint,parent_id bigint,level INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' WITH SERDEPROPERTIES ('serialization.format'=',', 'field.delim'=',') STORED AS TEXTFILE LOCATION '/hfc/sip/service/topology/$actual_full'"

echo "template is $template";
#impala-shell -V -i $node -d $database -q $template
impala-shell -V -i $node -q $template

这就是我调用它的方式:

createImpalaPartition $actual $impalaDatabase $impalaNode

在哪里

actual=$(date +'%s')
impalaDatabase="dbName"
impalaNode="name_of_the_node"

脚本的执行返回:

[core@dub-vcd-vms170 ~]$ createImpalaPartition $actual $impalaDatabase $impalaNode
template is use c2d;create EXTERNAL TABLE exptopology_1428326587 (child_id bigint,parent_id bigint,level INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' WITH SERDEPROPERTIES ('serialization.format'=',', 'field.delim'=',') STORED AS TEXTFILE LOCATION '/hfc/sip/service/topology/2015/04/06/14/23/'
Error, could not parse arguments "c2d;create EXTERNAL TABLE exptopology_1428326587 (child_id bigint,parent_id bigint,level INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' WITH SERDEPROPERTIES ('serialization.format'=',', 'field.delim'=',') STORED AS TEXTFILE LOCATION '/hfc/sip/service/topology/2015/04/06/14/23/'"
 Usage: impala_shell.py [options]

如您所见,我必须使用 shell 脚本创建表。

更新:

按照link,我可以看到 impala-shell 可以这样使用,但我没有使用正确的参数。

我使用了-f 而不是-q,同样的错误仍然存​​在。有人可以帮帮我吗?

【问题讨论】:

【参考方案1】:

您需要引用$template 的扩展,以便将整个字符串视为impala-shell 的单个参数:

impala-shell -V -i $node "$template"

-V 启用详细输出。对于非详细(安静)输出,将 -V 替换为 -q

【讨论】:

【参考方案2】:

我终于发现了如何解决我的问题。

function createImpalaPartition() 

period_id=$1;
database=$2
node=$3

actual_full=$(date -d@"$period_id" +%Y/%m/%d/%H/%M/)
#UC=$(impala-shell -r -q "select count(1) from table where condition=1" -d $DB -i $HOST -B)
# attention, i have to use this way impala-shell
impala-shell -V -i $node -d $database -q "create EXTERNAL TABLE exptopology_$period_id (child_id bigint,parent_id bigint,level INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' WITH SERDEPROPERTIES ('serialization.format'=',', 'field.delim'=',') STORED AS TEXTFILE LOCATION '/hfc/sip/service/topology/$actual_full'"

我不能在 create 命令中使用模板变量,我必须以这种方式传递命令。

【讨论】:

使用-q,您不能传递 USE 语句和另一个查询,完全限定默认数据库之外的任何表的名称。 (或者使用 -f 选项传递带有 USE 语句后跟其他查询的文件。)Refer

以上是关于关于如何在 shell 脚本中运行 impala-shell的主要内容,如果未能解决你的问题,请参考以下文章

impala shell,带有大写字母的 shell 命令

将 hdfs 上的脚本文件传递给 impala-shell

有没有办法用带参数的sql脚本运行impala shell?

如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?

CDH 5.3.2 - 需要从 shell/脚本重新启动 impala 守护进程

一旦我已经在 impala shell 中,如何运行 .sql 文件?