如何从Big Query cli运行保存的查询并将结果导出为CSV?

时间:2018-03-01 07:24:31

标签: google-bigquery

我在Big Query中有一个已保存的查询,但它太大而无法导出为CSV。我没有权限导出到新表,所以有没有办法从bq cli运行查询并从那里导出?

2 个答案:

答案 0 :(得分:1)

在CLI中,您无法直接访问已保存的查询,因为它是截至目前的仅限UI功能,但正如here所述,有一项功能请求。

如果您只想运行一次以获得结果,则可以从用户界面复制查询,然后在使用QUERY="SELECT word, SUM(word_count) as count FROM publicdata:samples.shakespeare WHERE word CONTAINS 'raisin' GROUP BY word" bq query $QUERY > results.csv 时将其粘贴。

使用文档example query,您可以使用公共数据集尝试以下操作:

cat results.csv

+---------------+-------+ | word | count | +---------------+-------+ | dispraisingly | 1 | | praising | 8 | | Praising | 4 | | raising | 5 | | dispraising | 2 | | raisins | 1 | +---------------+-------+ 的输出应为:

QUERY

只需将--use_legacy_sql变量替换为您保存的查询即可。 此外,take into account如果您使用带有{{1}}标志的标准或旧版SQL。

参考文档here

答案 1 :(得分:0)

尽管您可能从官方文档中了解到了什么,但您可以从bq query获得大量查询结果,但您必须了解多个详细信息。

首先,这是一个例子。我使用following commands从公共数据集usa_names.usa_1910_2013获取了公共表bigquery-public-data的所有行:

total_rows=$(bq query --use_legacy_sql=false --format=csv "SELECT COUNT(*) AS total_rows FROM \`bigquery-public-data.usa_names.usa_1910_2013\`;" | xargs | awk '{print $2}');
bq query --use_legacy_sql=false --max_rows=$((total_rows + 1)) --format=csv "SELECT * FROM \`bigquery-public-data.usa_names.usa_1910_2013\`;" > output.csv

此命令的结果是一个包含5552454行的CSV文件,前两行包含标题信息。此表中的行数为5552452,因此它会检出。

这里有注意事项:

  • 无论documentation might seem to say具体是什么时候查询下载限制,这些限制似乎只适用于Web UI,这意味着bq可以免除;
  • 起初,我使用Cloud Shell运行此bq命令,但行数太大以至于将结果集流式传输到其中会导致Cloud Shell实例失败!我必须使用至少与n1-standard-4(4vCPU,16GiB RAM)相同资源的Compute实例,即使使用所有这些RAM,查询也需要10分钟才能完成(请注意查询本身在服务器端运行,它只是缓冲结果的问题);
  • 我手动复制粘贴查询本身,因为似乎不是直接从bq引用已保存查询的方法;
  • 您不必使用标准SQL,但 指定max_rows,否则它只会返回100行(当前为100行)此参数的默认值);
  • 您仍然会面对与BigQuery相关联的常见quotas & limits,因此您可能希望将其作为批处理作业运行,这取决于您。此外,请不要忘记查询的最大响应大小为128 MiB,因此您可能需要将查询分解为多个bq query命令才能达到此大小限制。如果您希望公开表格足以在查询期间达到此限制,请尝试使用samples.wikipedia数据集中的bigquery-public-data

我认为这是关于它的!只要确保你在一台强大的机器上运行这些命令,经过几次尝试就可以得到你想要的结果!

P.S。:目前有一项功能请求可以增加您可以从Web UI下载的CSV的大小。 You can find it here