如何将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
相关产品推荐
相关产品推荐

