【发布时间】:2018-03-01 07:24:31
【问题描述】:
我在 Big Query 中有一个已保存的查询,但它太大而无法导出为 CSV。我没有导出到新表的权限,所以有没有办法从bq cli 运行查询并从那里导出?
【问题讨论】:
标签: google-bigquery
我在 Big Query 中有一个已保存的查询,但它太大而无法导出为 CSV。我没有导出到新表的权限,所以有没有办法从bq cli 运行查询并从那里导出?
【问题讨论】:
标签: google-bigquery
从 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。
【讨论】:
尽管您可能从官方文档中了解到,您可以从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。
以下是需要注意的地方:
bq 不受这些限制;bq 命令,但是行数太大以至于将结果集流式传输到其中会杀死 Cloud Shell 实例!我必须使用至少与n1-standard-4(4vCPU,16GiB RAM)具有相同资源的 Compute 实例,即使使用所有这些 RAM,查询也花了我 10 分钟才能完成(请注意,查询本身运行服务器-side,只是缓冲结果的问题);bq 引用已保存的查询;max_rows,否则它只会返回 100 行(100 是此参数的当前默认值) ;bq query 命令,以免达到此大小限制。如果您想要一个足够大以在查询期间达到此限制的公共表,请尝试使用 bigquery-public-data 数据集中的 samples.wikipedia 表。我想就是这样!只需确保您在强大的机器上运行这些命令,经过几次尝试,它应该会给您想要的结果!
P.S.:目前有一项功能要求增加您可以从 Web UI 下载的 CSV 文件的大小。 You can find it here.
【讨论】: