我正在创建unix shell脚本来执行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_file和output_log中得到两个名称输出。但是我需要在output_log变量中记录“在0.83s中提取2行”。我怎么才能得到它?
我不熟悉impala,所以我不相信你所做的是查询impala最有效的方法。但是,您正在尝试专注于特定的输出行;我可以回答
有很多方法可以做到这一点。也许最简单的是grep:
output_log = echo `impala-shell -i $node -q "select name from impaladb.impalatbl" -o output_file | grep Fetch`
试试这个:
解决方案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
我解决了这个问题。它的工作方式是impala在不同的流中发送查询输出,而另一个信息则在不同的流中发送查询。
因此,你所要做的就是
impala-shell -i $node -q "select name from impaladb.impalatbl" 2>output_file
2>将在输出文件中发送包含“10秒内获取1行”的输出。现在你可以grep它或做你想做的任何事情。
假设您要在output_log变量中存储相同的输出,然后使用
output_log=$(impala-shell -i $node -q "select name from impaladb.impalatbl" 2>&1)
这里2>&1将输出发送到stdout,它将用于将值赋给变量。
有关这方面的更多信息,只需在Google搜索中添加2>&1并了解有关它的更多信息。
希望它能帮到你!!
一些额外的观察
2>&1重定向从stderr到stdout的输出,但stdout也获取查询输出,所以当你将它存储在一个变量中时,它将获得查询输出以及额外信息,如“在3秒内获取1行”
但
我们用的时候
2> a.txt然后只有stderr输出被重定向。所以a.txt只包含“启动impala ......在2秒内获取1行”等信息。然后你可以从文件grep并将其放在一个变量中。
只是想强调我在存储文件和存储在变量之间观察到的这种微小差异。