簡體   English   中英

從大型 Pandas DataFrames 加載 BigQuery 表

[英]Loading BigQuery tables from large pandas DataFrames

我正在嘗試使用官方 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 中的 parquet 文件中的 uri parquet_uri並從該文件加載表:

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表中?

先感謝您,

喬瓦尼

如果您的 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 文件中的數據塊使用以下壓縮編解碼器:

  • 活潑的 GZip
  • LZO_1C
  • LZO_1X

您可以在此鏈接閱讀更多信息: https : //cloud.google.com/bigquery/docs/loading-data-cloud-storage-parquet

我能夠通過將大 df 分成幾個塊並將它們中的每一個加載到 BigQuery 中的表中來將大 df 上傳到 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()

Parquet 是列式數據格式,這意味着加載數據需要讀取所有列。 在鑲木地板中,列被分成頁面。 BigQuery 將每一列的整個未壓縮頁面保存在內存中,同時從中讀取數據。 如果輸入文件包含太多列,BigQuery 工作人員可能會遇到內存不足錯誤。 如果您考慮增加查詢的分配內存,則需要閱讀 Bigquery 槽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM