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 语法无法将分区表导出到单个文件中。解决方法是使用UIbq 命令导出。

使用 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 上的分区表?

从 Google BigQuery 导出到 CloudSQL?

列中的 BigQuery 日期分区

如何从已分区的 BigQuery 表中提取单个分区?

使用自定义目标接收器将日志导出到 BigQuery(表分区)