【问题标题】:Controlling file size while exporting data from bigquery to Google Cloud Storage在将数据从 bigquery 导出到 Google Cloud Storage 时控制文件大小
【发布时间】:2023-04-10 22:02:01
【问题描述】:

我正在努力将大型数据集从 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(每个文件)的压缩文件。有什么办法可以做到吗?

【问题讨论】:

    标签: python-3.x google-cloud-platform google-bigquery google-cloud-storage


    【解决方案1】:

    很遗憾,没有 - Google 会自行调整 - 您没有指定大小的选项。 我相信这是因为未压缩数据的大小(所以每个 BQ 工作人员生成一个文件,并且不可能从多个工作人员生成一个文件)

    【讨论】:

    • 嗨,Alexey - 感谢您的回答。您能帮我了解一下 export 在内部是如何运作的吗?
    • 我不是谷歌员工 :) - 但我和 BQ eng 谈了很多 - 所以我想当你在 BQ 中做某事时的想法 - 它试图通过在多台机器 - 这就是为什么 BQ 如此之快,这也是为什么有时会超出资源 - 当 BQ 无法根据您的标准拆分数据时。
    • 当您导出时 - 发生的情况完全相同 - 您的所有数据在多台机器之间分配,每台机器生成文件并流式传输到 gzip - 可能所有事情都发生在 RAM 中。所以现在想象 1GB 的 gziped 文件可以是 100s GB 未压缩 - 在这种情况下一切都会很慢 - 但同时不同的数据可能有不同的压缩比 - 所以很难预测文件的最终大小 - 所以指定目标大小会破坏整体系统速度
    【解决方案2】:

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

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

    您在此处回答了类似的问题:{2}

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

    {2}:Exporting data to GCS from BigQuery - Split file size control

    【讨论】:

    • 我认为它不适用于 gzip。它只会产生相同的 40-70MB 但名称为 00..xx 的分片
    • 在我的例子中,我正在尝试创建一个可以为多个数据集和表运行的实用程序。如果我们不知道数据大小,我想它会失败。如有错误请指正。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2014-09-18
      • 1970-01-01
      • 2015-04-04
      • 2023-04-08
      • 2014-12-05
      • 2017-12-14
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多