如何使用bq CLI带查询条件指定分隔符导出CSV至Google Storage
实现方法
bq extract 本身不支持直接内嵌查询过滤条件,只能导出完整的表、视图或者表的指定分区/簇,要实现按条件拆分导出+;作为字段分隔符的需求,有两种可落地的方案,都不需要额外做本地文件转码。
方案1:临时表中转导出(逻辑直观,适配所有bq版本)
核心思路是先把符合过滤条件的结果存成临时表,再用你已经熟悉的bq extract命令按要求导出:
- 按过滤条件分别生成带过期时间的临时表,避免冗余存储占用
# 生成洛杉矶数据的临时表,设置1小时后自动过期 bq query --nouse_legacy_sql \ --destination_table=mydataset.temp_la_cities \ --table_expiration=3600 \ "SELECT * FROM mytable.cities WHERE city = 'Los Angeles'" # 生成纽约数据的临时表,设置1小时后自动过期 bq query --nouse_legacy_sql \ --destination_table=mydataset.temp_ny_cities \ --table_expiration=3600 \ "SELECT * FROM mytable.cities WHERE city = 'New York'" - 分别对两个临时表执行自定义分隔符的导出操作
# 导出洛杉矶数据 bq extract --destination_format=CSV --field_delimiter=';' \ mydataset.temp_la_cities gs://myBucket/la_cities.csv # 导出纽约数据 bq extract --destination_format=CSV --field_delimiter=';' \ mydataset.temp_ny_cities gs://myBucket/ny_cities.csv
方案2:用EXPORT DATA语句一步完成(更省资源,无需建临时表)
你之前认为bq query无法自定义CSV分隔符是认知误区:bq query搭配EXPORT DATA语法时,完全可以直接指定导出文件的分隔符、格式等参数,过滤和导出一步完成,不需要中转临时表:
# 直接导出洛杉矶数据到GCS bq query --nouse_legacy_sql " EXPORT DATA OPTIONS( uri='gs://myBucket/la_cities*.csv', format='CSV', field_delimiter=';', overwrite=true, header=true ) AS SELECT * FROM mytable.cities WHERE city = 'Los Angeles'; " # 直接导出纽约数据到GCS bq query --nouse_legacy_sql " EXPORT DATA OPTIONS( uri='gs://myBucket/ny_cities*.csv', format='CSV', field_delimiter=';', overwrite=true, header=true ) AS SELECT * FROM mytable.cities WHERE city = 'New York'; "
注意:如果单份过滤后的数据量超过1GB,uri路径必须带通配符
*,BigQuery会自动拆分生成多个分片文件,符合GCS导出的单文件大小限制。
内容的提问来源于stack exchange,提问作者Denoma
相关产品推荐
相关产品推荐

