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

Posted

技术标签:

【中文标题】如何从 Big Query cli 运行保存的查询并将结果导出到 CSV?【英文标题】:How do you run a saved query from Big Query cli and export result to CSV? 【发布时间】:2018-03-01 07:24:31 【问题描述】:

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

【问题讨论】:

【参考方案1】:

从 CLI 中,您无法直接访问已保存的查询,因为它现在是一个仅限 UI 的功能,但正如 here 解释的那样,有一个功能请求。

如果您只想运行一次以获得结果,您可以从 UI 中复制查询,然后在使用 bq 时将其粘贴。

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

QUERY="SELECT word, SUM(word_count) as count FROM publicdata:samples.shakespeare WHERE word CONTAINS 'raisin' GROUP BY word"
bq query $QUERY > results.csv

cat results.csv 的输出应该是:

+---------------+-------+
|     word      | count |
+---------------+-------+
| dispraisingly |     1 |
| praising      |     8 |
| Praising      |     4 |
| raising       |     5 |
| dispraising   |     2 |
| raisins       |     1 |
+---------------+-------+

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

参考文档here。

【讨论】:

【参考方案2】:

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

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

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,所以check out。

以下是需要注意的地方:

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

我想就是这样!只需确保您在强大的机器上运行这些命令,经过几次尝试,它应该会给您想要的结果!

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

【讨论】:

以上是关于如何从 Big Query cli 运行保存的查询并将结果导出到 CSV?的主要内容,如果未能解决你的问题,请参考以下文章

在 Big Query 中检索覆盖的已保存查询

如何使用计划查询刷新 Google Big Query 中的现有表?

将数组保存到Big Query

Big Query 未成功执行

如何设置 Big Query 表的过期时间?

如何在 Big Query 中查询 Firebase Analytics 事件表的多个分区