从命令行轻松运行 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 查询并下载结果?的主要内容,如果未能解决你的问题,请参考以下文章