BigQuery 导出 CSV:我可以控制输出分区吗?
Posted
技术标签:
【中文标题】BigQuery 导出 CSV:我可以控制输出分区吗?【英文标题】:BigQuery export CSV: Can I control output partitioning? 【发布时间】:2021-12-23 17:10:19 【问题描述】:此语句将查询结果导出到 GCS:
EXPORT DATA OPTIONS(
uri='gs://<bucket>/<file_name>.*.csv',
format='CSV',
overwrite=true,
header=true
) AS
SELECT * FROM dataset.table
它将大量数据拆分为多个文件,有时还会产生空文件。我似乎在 BigQuery 文档中找不到任何关于如何控制它的信息。我可以将导出配置为单个文件吗?或者分成 N 个文件,每个文件最多 1M 行?还是 N 个文件,每个文件最大 50MB?
【问题讨论】:
【参考方案1】:我测试了不同的场景(使用公共数据集),发现当您的表已分区且小于 1 GB 时,导出数据会拆分为多个文件。在导出过程中使用wildcard operator 时会出现此结果。
BigQuery 支持在每个 URI 中使用单个通配符运算符 (*)。通配符可以出现在 URI 中的任何位置,除了作为存储桶名称的一部分。使用通配符运算符指示 BigQuery 根据提供的模式创建多个分片文件。
很遗憾,EXPORT DATA
语法需要通配符,否则您的查询将失败并出现此错误:
我可以将导出配置为单个文件吗?或者分成 N 个文件,每个文件最多 1M 行?还是 N 个文件,每个文件最大 50MB?
如上所述,使用EXPORT DATA
语法无法将分区表导出到单个文件中。解决方法是使用UI
或bq
命令导出。
使用 UI 导出:
Open table > Export > Export to GCS > Fill in GCS location and filename
使用bq
工具:
bq extract --destination_format CSV \
bigquery-public-data:covid19_geotab_mobility_impact.us_border_wait_times \
gs://bucket_name/900k_rows_using_bq_extract.csv
使用公共数据分区表,bigquery-public-data.covid19_geotab_mobility_impact.us_border_wait_times
。请参阅csv
使用这三种不同方法导出到 GCS 存储桶的文件。
【讨论】:
@stkvtflw 嗨,OP,我可以看到我的答案被否决了,但我不知道为什么,请让我知道我的答案是否有帮助,以便我改进或删除它。跨度> @stkvtflw 编辑了我的答案并使用bq extract
命令添加了测试。
谢谢。您提出的解决方案需要使用命令行。我几乎没有说服我的客户在 BigQuery UI 中使用 SQL 来满足他的需求,所以我需要坚持下去。此外,您提出的解决方案不会过滤任何内容,只会导出整个表格。如果我错了,请纠正我。
@stkvtflw 你是对的,我提供的选项是导出整个表。如果您的 select
语句需要过滤,我想您唯一的选择是单独运行 select 语句,然后使用 BQ UI 中的 SAVE RESULTS
功能并将文件手动上传到 GCS。以上是关于BigQuery 导出 CSV:我可以控制输出分区吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 GCS 中的 csv 随机样本导出到 BigQuery
使用特定时间戳列将 CSV 导入 BigQuery 上的分区表?