从命令行轻松运行 BigQuery 查询并下载结果?

Posted

技术标签:

【中文标题】从命令行轻松运行 BigQuery 查询并下载结果?【英文标题】:Easily run a BigQuery query from the commandline and download the results? 【发布时间】:2017-05-09 14:45:00 【问题描述】:

我正在使用 BigQuery 进行一些数据处理,并希望将一些查询的输出用作数据处理管道下一阶段的输入,理想情况下允许我执行以下操作:

bigquery $QUERY | ./process.sh

我目前可以通过这样做来实现类似的目标:

bq --nosync query --max_rows 100000000 --use_cache --batch --use_legacy_sql=false $QUERY

bq wait $JOBID

bq --format csv head -j $JOBID --max_rows 100000000 | ./process.sh

但我不确定使用head 下载所有数据(数千万行)是否不如将结果写入表,然后将其导出到谷歌存储,然后下载它?是否有任何现有的工具可以为我抽象出所有这些,让我运行一个查询,然后为我发送/下载完整的输出?

【问题讨论】:

这根本无法扩展。你的脚本对这些数据做了什么? BigQuery 专为分析和聚合而设计,而不是通过网络将数千万行拉入 bash 脚本。 就这个问题而言,脚本的作用并不重要,实际上我有多个管道,其中处理步骤执行各种不同的事情。我确实在使用 BigQuery 进行分析和聚合,但我需要以简单的方式处理数据。这对于我正在迁移的 AWS RedShift 来说是微不足道的。使用我的head 示例或从 GCS 下载似乎可以使用 BigQuery,但我想找到一个从我那里抽象出来的命令。 改用 Cloud Dataflow 管道怎么样?还是必须留在 bash 中? 【参考方案1】:

使用head,您可能会达到 API 配额限制,并且对于这么多数据的性能非常差,因为这不是它的预期用途。另请注意,设置max_rows above the limit 只会返回限制。您导出目标表的想法是正确的方法。 您可以找到有关导出here 和从gcs here 下载的更多信息。

bq extract --destination_format=NEWLINE_DELIMITED_JSON 'bigquery-public-data:samples.shakespeare' gs://example-bucket/shakespeare.json


gsutil cp -r gs://example-bucket/shakespeare.json local_dir

【讨论】:

什么配额?能否给出一个导出然后下载数据的命令行示例? 其实这次调用的唯一配额是标准 API qps 配额:cloud.google.com/bigquery/quota-policy#apirequests。但是使用“head”肯定会影响性能,尤其是当你在桌子上走得更远时。将 max_rows 设置为 100000000 将不起作用,因为这超出了 100k 的 max_rows 限制,因此它只会返回 100k:cloud.google.com/bigquery/docs/data#paging-through-list-results。我将更新答案以包含示例。 不,它确实有效 - 我通过这种方式获得了超过 500 万个结果。查询命令 max 最大限制为 10k,但 head 命令没有最大值。 啊,你是对的 - 后端有这个限制,但命令行客户端会为你分页结果。所以它仍然发出许多请求,但在返回结果之前将它们组合起来。

以上是关于从命令行轻松运行 BigQuery 查询并下载结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取在 BigQuery 命令行工具中运行的最后一个作业的作业 ID?

BigQuery 命令行工具返回不同的结果

Bigquery 命令行工具,用于从文件中读取长查询字符串

使用 Stata 从 BigQuery 下载数据

Bigquery 返回重复的行以及错误的计数

谷歌 BigQuery 安装