有没有一种方法可以通过一个命令提取完整的 BigQuery 分区表,以便将每个分区的数据提取到格式为 part_col=date_yyyy-mm-dd 的单独文件夹中
既然Bigquery分区表可以从hive类型的分区目录中读取文件,有没有办法以类似的方式提取数据。我可以单独提取每个分区,但是当我提取很多分区时,这非常麻烦
您可以通过编程来完成此操作。例如,您可以使用分区装饰器导出分区数据,例如table$20190801。然后在 bq extract 命令上,您可以使用 URI Patterns (查看工人模式的示例)来获取 GCS 对象。
由于所有对象都位于同一个存储桶中,因此文件夹只是分层幻觉,因此您也可以在文件夹上指定 URI 模式,但不能在存储桶上指定 URI 模式。
因此,您可以编写一个脚本,在其中循环 DATE 值,例如:
bq extract
--destination_format [CSV, NEWLINE_DELIMITED_JSON, AVRO]
--compression [GZIP, AVRO supports DEFLATE and SNAPPY]
--field_delimiter [DELIMITER]
--print_header [true, false]
[PROJECT_ID]:[DATASET].[TABLE]$[DATE]
gs://[BUCKET]/part_col=[DATE]/[FILENAME]-*.[csv, json, avro]
test_dataset
将项目设置为
gcloud init
。bq extract --destination_format=CSV 'test_partitiontime$20210716' gs://testbucket/20210716/test*.csv
这将在 20210716
内创建一个名为
testbucket
的文件夹,并在其中写入文件。#!/bin/bash
input_start=2018-1-1
input_end=2018-3-1
project=myproject
dataset=mydataset
table=table_of_stuff
startdate=$(date -I -d "$input_start") || exit -1
enddate=$(date -I -d "$input_end") || exit -1
d="$startdate"
while [[ "$d" < "$enddate" ]]; do
year_val=$(date --date="$d" +%Y)
mon_val=$(date --date="$d" +%m)
day_val=$(date --date="$d" +%d)
echo bq extract --location=US --destination_format PARQUET --compression SNAPPY $project:$dataset.$table\$$year_val$mon_val$day_val gs://your_bucket/table_archive/$year_val/$dataset/$table/date_col=$year_val$mon_val$day_val/*.parquet
d=$(date -I -d "$d + 1 day")
done