使用大型 pandas DataFrame 加载 BigQuery 表

5

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

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

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

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

2)将数据框保存为parquet文件,存储在Google Cloud Storage中的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表中?
提前感谢您的帮助,
Giovanni
3个回答

8

我成功地将大型DataFrame上传到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()


如果您想替换表而不是追加数据,您会怎么做?看起来您需要先发出一个“DROP TABLE”查询,然后进行迭代写入,这并不是最优雅的解决方案。 - Tom Hood
1
你可以在循环的第一次迭代中将 job_config.write_disposition 字段从 WRITE_APPEND 更改为 WRITE_TRUNCATE,然后在其余的迭代中继续使用 WRITE_APPEND - GiovanniAlbertoF
那就可以了,小猪,那就可以了。+1 - Tom Hood

2
如果您的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中。 - GiovanniAlbertoF

-1

Parquet是一种列式数据格式,这意味着加载数据需要读取所有列。在Parquet中,列被分成页面。当从中读取数据时,BigQuery会将每个列的整个未压缩页面保存在内存中。如果输入文件包含太多列,BigQuery工作人员可能会遇到内存不足错误。 如果您考虑增加查询的分配内存,您需要了解有关Bigquery slots的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接