2017-05-09 62 views
0

我在做与BigQuery一些数据处理,并希望用一些查询作为输入输出到数据处理管道的下一个阶段,最好让我做这样的事情:从命令行轻松运行BigQuery查询并下载结果?

bigquery $QUERY | ./process.sh 

我“M能够实现由目前这样做类似的事情:

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比,而不是把结果写入一个效率较低表格,然后将其导出到谷歌存储,然后下载它?有没有现成的工具可以为我抽象掉所有这些东西,让我运行一个查询,然后发送/下载完整的输出给我?

+0

这只是不按比例。你的脚本是如何处理这些数据的? BigQuery专为分析和聚合而设计,而不是通过线路拉动数千万行,然后进入bash脚本。 –

+0

就这个问题而言,脚本的作用并不重要,而且我实际上有多个流水线,其中处理步骤执行各种不同的操作。 我确实使用BigQuery进行分析和聚合,但我需要以一种简单的方式处理数据。 AWS RedShift是微不足道的,我正在从中迁移。 BigQuery似乎可以通过我的'头部'例子或通过从GCS下载来实现,但是我想找到一个能够从我这里抽象出来的命令。 –

+0

如何使用云端数据流管道代替?或者你必须留在bash中? –

回答

0

使用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 
+0

什么配额?你可以给出一个命令行的例子,导出然后下载数据? –

+0

实际上,此调用的唯一配额是标准API qps配额:https://cloud.google.com/bigquery/quota-policy#apirequests。但是,当你进一步深入研究时,表现肯定会受到'头部'的影响。将max_rows设置为100000000将无法正常工作,因为它超出了100k的max_rows限制,因此它只会返回100k:https://cloud.google.com/bigquery/docs/data#paging-through-list-results。我会更新答案以包含示例。 –

+0

不,它绝对有效 - 我通过这种方式获得超过500万个结果。查询命令max最大为10k,但head命令没有最大值。 –