将 BQ 查询的输出分配给变量

Posted

技术标签:

【中文标题】将 BQ 查询的输出分配给变量【英文标题】:Assigning the output of a BQ query to variable 【发布时间】:2017-07-27 13:12:01 【问题描述】:

我正在尝试查询 BigQuery 中分区的总数并将结果存储在 mysql 表中。我这样做是出于监控目的。

#!/bin/sh
query1="bq query --format=csv 'SELECT COUNT(1) as Count FROM [dataset.tablename] WHERE _PARTITIONTIME = TIMESTAMP(\"$date\")'"
eval result=\$\($query1\)
echo "$result"

bq_insertquery="insert into <<table>>(<<column>>) values($result)"
echo $bq_insertquery | mysql -u root -p <<dbname>>

在 mysql 表中插入时出现错误。这可能是因为变量 $result 包含标头和值,即

变量 $result 持有:带有标头的值

看起来 myquery 将能够插入数据,如果我只得到值。 我应该如何只为 shell 变量赋值,然后再使用它?

编辑:任何 sql 输出都包含 column_name 和值。我分配用于存储来自 BigQuery 的值的变量也包含两者,即 column_name 和 value。我正在寻找有助于提取价值的东西。

【问题讨论】:

How to set a variable to the output from a command in Bash?的可能重复 @I0b0 我已经更新了问题 它仍然是重复的。看看链接的问题。仅提取值是一个完全独立的问题,已解决here 我检查了给定的方法,包括命令替换,但都没有帮助仅提取值。这是我面临的主要问题“仅提取值是一个完全独立的问题”。 【参考方案1】:

只需添加 --quiet 标志(在作业运行时忽略状态更新),并将其通过管道传递给 awk

query1="bq query --quiet --format=csv 'SELECT COUNT(1) as Count FROM [dataset.tablename] WHERE _PARTITIONTIME = TIMESTAMP(\"$date\")' | awk 'if(NR>1)print'"

【讨论】:

【参考方案2】:

我想使用jq 命令来解析查询的 json 输出。在此之前,您需要先安装jq 命令。这是将计数放入a的方法

result=$(echo -e "select 1 as col" | bq query --nouse_legacy_sql --format=json)
echo $result

它显示输出["col":"1"]。现在是时候使用jq 命令来获得最终输出了。

count=$(echo $count | jq '.[0]' | jq '.col')
echo $count

一行:

count=$(echo $(echo -e "select 1 as col" | bq query --nouse_legacy_sql --format=json) | jq '.[0]' | jq '.col')

【讨论】:

以上是关于将 BQ 查询的输出分配给变量的主要内容,如果未能解决你的问题,请参考以下文章

将输出分配给Bash中的变量[重复]

将函数的输出分配给R中的两个变量

如何将 Bash 命令的输出分配给变量? [复制]

将函数打印输出分配给字符串变量

作为 dplyr 管道的一部分,将中间输出分配给 temp 变量

将 os.system 的输出分配给一个变量并防止它显示在屏幕上[重复]