我在Big query中保存了一个查询,但它太大了,无法导出为CSV。我没有导出到新表的权限,所以有没有一种方法可以从bq
cli运行查询并从那里导出?
发布于 2018-03-02 03:34:37
从命令行界面,你不能直接访问你保存的查询,因为它是一个只有UI的功能,但是,正如here所解释的,有一个功能请求。
如果您只想运行一次来获得结果,那么可以从UI复制查询,然后在使用bq
时粘贴它。
使用docs 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
变量即可。另外,如果您使用的是带有--use_legacy_sql
标志的标准SQL或遗留SQL,则为take into account。
参考文档here。
发布于 2018-03-02 17:44:45
尽管您可能已经从官方文档中了解了什么,但您可以从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,所以它会进行校验。
这里是需要注意的地方:
bq
不受这些限制的影响;bq
命令,但是行数太大了,以至于将结果集流式传输到它中会杀死Cloud Shell实例!我必须使用至少与n1-standard-4
相同的资源的计算实例(4vCPU,16GiBRAM),即使有这么多内存,查询也需要10分钟才能完成(请注意,查询本身运行在服务器端,这只是一个缓存results);bq
引用保存的查询;max_rows
,因为否则它将只返回100行(100是此SQL的当前缺省值),因为它仍然面对与BigQuery关联的通常quotas & limits,所以您可能希望将其作为批处理作业运行,这取决于您。此外,不要忘记,一个查询的最大响应大小是128 MiB,因此您可能需要将查询拆分为多个bq query
命令,以避免达到此大小限制。如果您想要一个足够大以在查询期间达到此限制的公用表,请尝试bigquery-public-data
dataset中的samples.wikipedia
one。我想就是这样了!只要确保你在一台健壮的机器上运行这些命令,在几次尝试之后,它应该会给你你想要的结果!
P.S.:目前有一个功能请求,要求增加可从Web下载的CSV的大小。You can find it here。
https://stackoverflow.com/questions/49044582
复制相似问题