我正在将大型数据集从bigquery导出到Goolge云存储以压缩格式。在Google云存储中,我有文件大小限制(每个文件的最大文件大小为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 aprox。
你在这里回答了一个类似的问题:{2}
{1}: https://cloud.google.com/bigquery/docs/exporting-data#exporting_data_into_one_or_more_files
{2}:从BigQuery导出数据到GCS-拆分文件大小控制
正如其他成员评论的那样,这是不可能的。我认为这个问题不仅仅是必须处理谷歌特定的算法,它还涉及压缩文件在进行实际压缩之前是否可以计算其压缩大小的问题,答案是否定的。
因为所有的压缩技术都使用某种字典,所以任何文件的最终大小只有在所有符号都被翻译后才知道,这意味着压缩已经完成。还有一篇SO讨论了这一点,这篇文章确实解释了一些关于压缩的基本原理。
文件可以“填充”以使它们具有统一的更大大小,但这会破坏压缩的目标(即节省空间)。