Python 3.x 在将数据从bigquery导出到Google云存储时控制文件大小
我正在将大数据集从bigquery导出到Goolge云存储,并将其转换为压缩格式。在谷歌云存储中,我有文件大小限制(每个文件的最大文件大小为1GB)。因此,我在导出时使用拆分和同情心技术拆分数据。示例代码如下所示:Python 3.x 在将数据从bigquery导出到Google云存储时控制文件大小,python-3.x,google-cloud-platform,google-bigquery,google-cloud-storage,Python 3.x,Google Cloud Platform,Google 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 Confi
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} :
{2} :正如其他成员所评论的,这是不可能的。我认为这个问题不仅仅是要处理一个特定于谷歌的算法,它涉及的问题是,在进行实际压缩之前,是否可以计算压缩文件的压缩大小,而答案是否定的 因为所有的压缩技术都使用某种字典,所以任何文件的最终大小只有在所有符号被翻译后才能知道,这意味着压缩已经完成。还有另外一个讨论这一点的例子,这确实解释了压缩的一些基本原理
可以对文件进行“填充”以使其具有统一的更大尺寸,但这会破坏压缩的目标(即节省空间)。嗨,Alexey-谢谢你的回答。你能帮我理解导出在内部是如何工作的,工人是如何生成文件的吗?我不是谷歌的雇员:)-但我和BQ工程师谈了很多-所以我想当你在BQ中做一些事情的时候,这个想法-它试图通过在多台机器之间拆分来尽可能多地并行化它-这就是为什么BQ如此之快,这也是为什么你有时会得到它超出资源-当BQ无法根据您的标准分割数据时。当您进行导出时-发生完全相同的情况-在多台机器之间分割的所有数据,每台机器生成文件并流到gzip-并且可能在RAM中发生所有事情。现在想象一下1GB的gziped文件可以是100s GB的未压缩文件-在这种情况下,一切都会非常缓慢-但同时不同的数据可能有不同的压缩比-因此很难预测文件的最终大小-因此指定目标大小将破坏整个系统的速度-我不认为它会像要求的那样与gzip一起工作。它只会产生相同的40-70MB,但名称为00..xx的shards在我的例子中,我试图创建一个实用程序,将运行多个数据集和表。我想如果我们不知道数据的大小,它就会失败。如果我错了,请改正。