You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pandas DataFrame以Parquet格式写入GCS?Cloud Function场景排障

解决BigQuery查询结果写入GCS Parquet文件失败的问题

问题根源分析

你的代码无法写入Parquet文件主要有3个核心问题:

  • 文件打开模式错误:Parquet是二进制格式,用'w'文本模式写入会破坏二进制结构,必须用'wb'二进制模式
  • Content-Type设置错误:text/parquet不是标准MIME类型,正确类型应为application/parquet
  • 缺少Parquet处理依赖:pandas的to_parquet方法需要依赖pyarrow或fastparquet引擎,Cloud Function默认未预装

修正后的代码

def main(data, context):
    bucket_name = 'my-bucket'
    blob_name = 'myfile.parquet'
    query = "SELECT * FROM `mytable`"

    client = bigquery.Client() 
    storage_client = storage.Client.from_service_account_json('secret.json') 

    destination_blob = storage_client.bucket(bucket_name).blob(blob_name)
    # 设置正确的Parquet MIME类型
    destination_blob.content_type = 'application/parquet'
    
    query_job = client.query(query)
    # 二进制模式写入Parquet,指定pyarrow引擎
    df = query_job.result().to_dataframe()
    df.to_parquet(destination_blob.open('wb'), engine='pyarrow')

必要的依赖配置

在Cloud Function部署目录下创建requirements.txt文件,添加以下依赖:

google-cloud-bigquery
google-cloud-storage
pandas
pyarrow

优化方案(大数据场景推荐)

如果处理的数据量较大,不建议全量加载到DataFrame,直接用BigQuery原生导出功能更高效且稳定,同时完美支持嵌套字段:

def main(data, context):
    bucket_name = 'my-bucket'
    blob_name = 'myfile.parquet'
    dataset_id = '你的数据集ID'
    table_id = 'mytable'
    
    client = bigquery.Client()
    destination_uri = f'gs://{bucket_name}/{blob_name}'
    
    # 直接从BigQuery导出Parquet到GCS
    extract_job = client.extract_table(
        f'{client.project}.{dataset_id}.{table_id}',
        destination_uri,
        job_config=bigquery.ExtractJobConfig(
            destination_format=bigquery.DestinationFormat.PARQUET
        )
    )
    extract_job.result()

内容的提问来源于stack exchange,提问作者zZzZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 22:05:20