控制文件大小,同时将数据从bigquery导出到Google Cloud Storage



我正在努力将大型数据集从bigquery导出到Goolge云存储,以压缩格式。在谷歌云存储中,我有文件大小限制(每个文件的最大文件大小为1GB(。因此,我在导出时使用拆分和同情技术来拆分数据。示例代码如下:

gcs_destination_uri = 'gs://{}/{}'.format(bucket_name, 'wikipedia-*.csv.gz') 
gcs_bucket = storage_client.get_bucket(bucket_name)
# Job Config
job_config = bigquery.job.ExtractJobConfig()
job_config.compression = bigquery.Compression.GZIP
def bigquery_datalake_load():  
dataset_ref = bigquery_client.dataset(dataset_id, project=project)
table_ref = dataset_ref.table(table_id)
table = bigquery_client.get_table(table_ref)  # API Request
row_count = table.num_rows
extract_job = bigquery_client.extract_table(
table_ref,
gcs_destination_uri,
location='US',
job_config=job_config)  # API request
logging.info('BigQuery extract Started.... Wait for the job to complete.')
extract_job.result()  # Waits for job to complete.
print('Exported {}:{}.{} to {}'.format(
project, dataset_id, table_id, gcs_destination_uri))
# [END bigquery_extract_table]

此代码正在拆分大型数据集并压缩为.gz格式,但它返回多个压缩文件,其大小在 40MB 到 70MB 之间舍入。

我正在尝试生成大小为 1GB 的压缩文件(每个文件(。有什么办法可以做到这一点吗?

不幸的是没有 - 谷歌自己调整它 - 你没有指定大小的选项。 我相信这是因为未压缩数据的大小(所以每个BQ工作线程生成一个文件,并且不可能从多个工作线程生成一个文件(

我认为这是可能的。您需要知道导出的总大小,知道这一点后,您可以使用多个通配符 URI 拆分结果。{1}

例如,如果导出为 10GB,则可以定义 10 个通配符 URI,它们的大小为 1GB。

您在这里回答了一个类似的问题:{2}

{1}:https://cloud.google.com/bigquery/docs/exporting-data#exporting_data_into_one_or_more_files

{2}:从 BigQuery 将数据导出到 GCS - 拆分文件大小控制

正如其他成员评论的那样,这是不可能的。我认为这个问题不仅仅是必须处理谷歌特定的算法,它处理的是压缩文件是否可以在实际压缩之前计算其压缩大小的问题,而答案不是。

因为所有压缩技术都使用某种字典,所以只有在所有符号都翻译完之后,才能知道任何文件的最终大小,这意味着压缩已经完成。SO的另一篇文章对此进行了讨论,本文确实解释了有关压缩的一些基础知识。

文件可以被"填充"以使它们具有统一的更大大小,但这会破坏压缩的目标(即节省空间(。

最新更新