Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在将数据从bigquery导出到Google云存储时控制文件大小_Python 3.x_Google Cloud Platform_Google Bigquery_Google Cloud Storage - Fatal编程技术网

Python 3.x 在将数据从bigquery导出到Google云存储时控制文件大小

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

我正在将大数据集从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} :


{2} :

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

因为所有的压缩技术都使用某种字典,所以任何文件的最终大小只有在所有符号被翻译后才能知道,这意味着压缩已经完成。还有另外一个讨论这一点的例子,这确实解释了压缩的一些基本原理


可以对文件进行“填充”以使其具有统一的更大尺寸,但这会破坏压缩的目标(即节省空间)。

嗨,Alexey-谢谢你的回答。你能帮我理解导出在内部是如何工作的,工人是如何生成文件的吗?我不是谷歌的雇员:)-但我和BQ工程师谈了很多-所以我想当你在BQ中做一些事情的时候,这个想法-它试图通过在多台机器之间拆分来尽可能多地并行化它-这就是为什么BQ如此之快,这也是为什么你有时会得到它超出资源-当BQ无法根据您的标准分割数据时。当您进行导出时-发生完全相同的情况-在多台机器之间分割的所有数据,每台机器生成文件并流到gzip-并且可能在RAM中发生所有事情。现在想象一下1GB的gziped文件可以是100s GB的未压缩文件-在这种情况下,一切都会非常缓慢-但同时不同的数据可能有不同的压缩比-因此很难预测文件的最终大小-因此指定目标大小将破坏整个系统的速度-我不认为它会像要求的那样与gzip一起工作。它只会产生相同的40-70MB,但名称为00..xx的shards在我的例子中,我试图创建一个实用程序,将运行多个数据集和表。我想如果我们不知道数据的大小,它就会失败。如果我错了,请改正。