如何将BigQuery表拆分导出为多个10000行的CSV文件?
将BigQuery表拆分为固定行数的CSV文件
方法一:通过临时表拆分(按你的计划实现)
要把主表拆成多个10000行的临时表,核心思路是给主表每行分配行号,然后按行号范围批量抽取数据创建临时表,再逐一导出。可以用BigQuery脚本实现自动化循环:
DECLARE total_rows INT64; DECLARE batch_size INT64 DEFAULT 10000; DECLARE num_batches INT64; DECLARE current_batch INT64 DEFAULT 0; -- 获取主表总行数,计算需要拆分的批次 SET total_rows = (SELECT COUNT(*) FROM `你的项目ID.你的数据集ID.主表名`); SET num_batches = CEIL(total_rows / batch_size); -- 循环创建临时表并导出 WHILE current_batch < num_batches DO -- 创建对应批次的临时表 EXECUTE IMMEDIATE FORMAT(""" CREATE TEMP TABLE my_temp_table%03d AS SELECT field_a, field_b FROM ( SELECT field_a, field_b, ROW_NUMBER() OVER() AS row_num -- 给每行分配行号 FROM `你的项目ID.你的数据集ID.主表名` ) WHERE row_num BETWEEN %d AND %d """, current_batch, current_batch * batch_size + 1, (current_batch + 1) * batch_size); -- 导出当前临时表到GCS EXECUTE IMMEDIATE FORMAT(""" EXPORT DATA OPTIONS ( uri = 'gs://temp-file-in-gcs/test-export-%03d.csv', format = 'CSV', overwrite = true, header = true, field_delimiter = ',' ) AS SELECT field_a, field_b FROM my_temp_table%03d; """, current_batch, current_batch); SET current_batch = current_batch + 1; END WHILE;
注意事项
- 替换
你的项目ID.你的数据集ID.主表名为实际的主表路径 %03d会生成000、001这类格式的后缀,让文件名和临时表名按顺序排列,方便管理- 如果需要固定的行顺序,在
ROW_NUMBER() OVER()中添加ORDER BY子句,比如OVER(ORDER BY field_a)
方法二:直接导出拆分(更高效,无需临时表)
BigQuery的EXPORT DATA本身支持rows_per_file参数,能直接指定每个输出文件的最大行数,省去创建临时表的步骤:
EXPORT DATA OPTIONS ( uri = 'gs://temp-file-in-gcs/test-export-*.csv', format = 'CSV', overwrite = true, header = true, field_delimiter = ',', rows_per_file = 10000 -- 每个CSV文件最多10000行 ) AS SELECT field_a, field_b FROM `你的项目ID.你的数据集ID.主表名`;
这个方法更简洁高效,建议优先使用。
内容的提问来源于stack exchange,提问作者Ismail H
相关产品推荐
相关产品推荐

