如何使用unixshell脚本将impala查询输出日志放入变量中?

k3fezbri  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(966)

我正在创建unixshell脚本来执行impala查询。我需要得到impala查询的输出日志。例如,我尝试了下面的方法。

output_log = echo $(impala-shell -i $node -q "select name from impaladb.impalatbl" -o output_file)

输出:

+--------+
| name   |
+--------+
| tom    |
| mike   |
+--------+

Fetched 2 row(s) in 0.83s

在这里,我在output\u文件和output\u日志中得到两个名称输出。但是我需要“fetched 2 row(s)in 0.83s”log in output\u log变量。我怎样才能得到它?

pbpqsu0x

pbpqsu0x1#

我解决了这个问题。它的工作方式是,impala在不同的流中发送查询输出,而在不同的流中发送查询的其他信息。
所以你要做的就是

impala-shell -i $node -q "select name from impaladb.impalatbl" 2>output_file

2>将发送输出文件中包含“在10秒内获取1行”的输出。现在你可以做任何你想做的事。
假设您想在output\ log变量中存储相同的输出,那么使用

output_log=$(impala-shell -i $node -q "select name from impaladb.impalatbl" 2>&1)

这里2>&1将输出发送到stdout,stdout将用于将值赋给变量。
要了解更多信息,只需在google搜索中输入2>&1并了解更多信息。
希望对你有帮助!!
一些补充意见
2> &1将输出从stderr重定向到stdout,但stdout也获取查询输出,因此当您将其存储在变量中时,它将获取查询输出以及额外的信息,如“在3秒内获取1行”
但是
当我们使用
2> txt则只有stderr输出被重定向。因此,a.txt将只包含“starting impala…..fetched 1 row in 2 seconds”之类的信息。然后可以从文件中grep并将其放入变量中。
我只是想强调一下我观察到的存储在文件和存储在变量之间的细微差别。

bq8i3lrv

bq8i3lrv2#

我不熟悉 Impala ,所以我不确定你所做的是最有效的方式来查询 Impala 。但是,您正试图将注意力集中在特定的输出行上;我可以回答。
有很多方法可以做到这一点。也许最直接的是grep:

output_log = echo `impala-shell -i $node -q "select name from impaladb.impalatbl" -o output_file | grep Fetch`
q7solyqu

q7solyqu3#

试试这个:
解决方案1:

output_log=$(nohup impala-shell -k --ssl -i $node --verbose --delimited --query="select count(*) as cnt from impaladb.impalatbl" 2>/dev/null)
echo $output_log

解决方案2:

output_log=$(echo `impala-shell -k --ssl -i $node --verbose --delimited --query="select count(*) as cnt from impaladb.impalatbl" -o output_file | head output_file`)
echo $output_log

相关问题