如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?
Posted
技术标签:
【中文标题】如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?【英文标题】:How to get the impala query output log into a variable using unix shell script? 【发布时间】:2017-05-14 02:57:11 【问题描述】:我正在创建 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.83 秒内获取 2 行”日志。我怎样才能得到它?
【问题讨论】:
【参考方案1】:我对 impala 不熟悉,所以我不确定您所做的是否是查询 impala 的最有效方式。但是,您正试图专注于特定的输出行;我可以回答。
有很多方法可以做到这一点。也许最直接的就是 grep:
output_log = echo `impala-shell -i $node -q "select name from impaladb.impalatbl" -o output_file | grep Fetch`
【讨论】:
我试过了。它是空的。因为查询只返回如下表输出。 +--------+ |姓名 | +--------+ |汤姆| |迈克 | +--------+【参考方案2】:试试这个:
解决方案 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
【讨论】:
【参考方案3】:我解决了这个问题。 它的工作方式是 impala 在不同的流中发送查询输出,在不同的流中发送与查询相关的其他信息。
所以你要做的就是
impala-shell -i $node -q "select name from impaladb.impalatbl" 2>output_file
2> 将在输出文件中发送包含“Fetched 1 row in 10seconds”的输出。现在你可以 grep 或者做任何你想做的事情。
假设您想将相同的输出存储在 output_log 变量中,然后使用
output_log=$(impala-shell -i $node -q "select name from impaladb.impalatbl" 2>&1)
这里 2>&1 会将输出发送到标准输出,标准输出将用于将值分配给变量。
有关这方面的更多信息,只需将 2>&1 放入谷歌搜索并了解更多信息。
希望对你有帮助!!
一些额外的观察
2>&1 将输出从 stderr 重定向到 stdout 但 stdout 也会获取查询输出,因此当您将其存储在变量中时,它将获取查询输出以及额外信息,例如“在 3 秒内获取 1 行”
但是
当我们使用
2>a.txt 然后只有 stderr 输出被重定向。所以 a.txt 将只包含诸如“starting impala .....fetched 1 row in 2 seconds”之类的信息。然后您可以从文件中 grep 并将其放入变量中。
只是想强调一下我观察到的存储在文件中和存储在变量中的细微差别。
【讨论】:
以上是关于如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?的主要内容,如果未能解决你的问题,请参考以下文章
Unix shell script 找出脚本文件所在的目录?
Unix Shell 脚本作为 Pig 和 Hive 的 UDF