[英]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 文件中的數據塊使用以下壓縮編解碼器:
您可以在此鏈接閱讀更多信息: 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.