【问题标题】:Loading BigQuery tables from large pandas DataFrames从大熊猫数据帧加载 BigQuery 表
【发布时间】:2020-07-10 02:16:16
【问题描述】:

我正在尝试使用官方 python google-cloud-bigquery 客户端库将相对较大的 pandas 数据框 df 加载到 Google BigQuery 表 table_ref 中。

到目前为止,我已经尝试了两种不同的方法:

1) 直接从内存中的数据帧加载表

client = bigquery.Client()
client.load_table_from_dataframe(df, table_ref)

2) 将数据框保存到 Google Cloud Storage 中 uri parquet_uri 的 parquet 文件中,然后从该文件加载表:

df.to_parquet(parquet_uri)
client = bigquery.Client()
client.load_table_from_uri(parquet_uri, table_ref)

两种方法都会导致相同的错误:

google.api_core.exceptions.BadRequest:400 查询执行期间资源超出:UDF 内存不足。;无法读取 Parquet 文件 [...]。如果文件包含的行太大,或者为查询的列加载的页面的总大小太大,则可能会发生这种情况。

数据框df 有 3 列和 1.84 亿行。保存为 parquet 文件格式时,占用 1.64 GB。

有没有办法使用官方 python 客户端库将这样的数据帧上传到 BigQuery 表中?

提前谢谢你,

乔瓦尼

【问题讨论】:

    标签: python pandas google-cloud-platform google-bigquery parquet


    【解决方案1】:

    如果您的 parquet 文件已加载到 Google Cloud Storage 中,您可以直接加载到 BigQuery,无需 Python 脚本:

    bq load \
    --source_format=PARQUET \
    dataset.table \
    "gs://mybucket/00/*.parquet","gs://mybucket/01/*.parquet"
    

    地点:

    • mybucket 是您加载 parquet 文件的存储桶。
    • dataset.table 是你的餐桌

    BigQuery 以这种方式自动检测架构。

    BigQuery 支持 Parquet 文件中数据块的以下压缩编解码器:

    • Snappy GZip
    • LZO_1C
    • LZO_1X

    您可以在此链接阅读更多内容:https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-parquet

    【讨论】:

    • 感谢您的回答。不幸的是,您推荐的方法等同于我的第二种方法(它只是您发布的相同代码的 python 包装器),因此它会产生相同的错误。尽管如此,它还是指向了正确的方向,即将数据帧拆分为更多块,并将每个块分别加载到 BigQuery。
    【解决方案2】:

    我能够通过将大 df 拆分为几个块并将它们中的每个块加载并附加到 BigQuery 中的表来将其上传到 BigQuery,例如:

    client = bigquery.Client()
    for df_chunk in np.array_split(df, 5):
        job_config = bigquery.LoadJobConfig()
        job_config.write_disposition = bigquery.WriteDisposition.WRITE_APPEND
        job = client.load_table_from_dataframe(df_chunk, table_id, job_config=job_config)
        job.result()
    
    

    【讨论】:

      【解决方案3】:

      Parquet 是列式数据格式,这意味着加载数据需要读取所有列。在镶木地板中,列分为页面。 BigQuery 在从内存中读取数据时,会将每列的整个未压缩页面保留在内存中。如果输入文件包含太多列,BigQuery 工作人员可能会遇到内存不足错误。 如果您考虑增加查询分配的内存,则需要阅读 Bigquery 插槽。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 2023-02-07
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        相关资源
        最近更新 更多