Python 从大数据帧加载BigQuery表

Python 从大数据帧加载BigQuery表,python,pandas,google-cloud-platform,google-bigquery,parquet,Python,Pandas,Google Cloud Platform,Google Bigquery,Parquet,我正在尝试使用官方pythonGoogle cloud BigQuery客户端库将一个相对较大的pandasdataframedf加载到Google BigQuery表table_ref 到目前为止,我尝试了两种不同的方法: 1) 直接从内存中的数据帧加载表 client = bigquery.Client() client.load_table_from_dataframe(df, table_ref) 2) 将数据帧保存到Google云存储中的拼花文件,保存在uriparquet\u ur

我正在尝试使用官方python
Google cloud BigQuery
客户端库将一个相对较大的
pandas
dataframe
df
加载到Google BigQuery表
table_ref

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

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

client = bigquery.Client()
client.load_table_from_dataframe(df, table_ref)
2) 将数据帧保存到Google云存储中的拼花文件,保存在uri
parquet\u 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内存不足。;无法读取拼花地板文件[…]。如果文件包含的行太大,或者为查询列加载的页面的总大小太大,则可能会发生这种情况

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

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

提前谢谢大家,


Giovanni

如果您的拼花地板文件已经加载到Google云存储中,您可以直接加载到BigQuery中,而无需python脚本:

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

  • mybucket
    是您加载拼花文件的木桶
  • dataset.table
    是您的表
通过这种方式,BigQuery自动检测模式

BigQuery支持以下用于拼花地板文件中数据块的压缩编解码器:

  • 敏捷的GZip
  • LZO_1C
  • LZO_1X

您可以在该链接上阅读更多内容:

我可以将大型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()


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

谢谢您的回答。不幸的是,您推荐的方法与我的第二种方法相当(这只是一个围绕您发布的相同代码的python包装器),因此它会产生相同的错误。然而,它指向了正确的方向,即将数据帧分割成更多的块,并分别加载到BigQuery。