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

将DataFrame写入BigQuery表时遇TypeError问题的解决咨询

解决BigQuery LoadJobConfig初始化时的TypeError问题

首先说结论:你遇到的问题大概率不是Pandas版本升级导致的,而是google-cloud-bigquery客户端库的版本更新带来的API变化。咱们来一步步解决这个问题:

错误原因分析

你的错误提示 TypeError: __init__() got an unexpected keyword argument 'schema' 看起来有点矛盾(毕竟你的SchemaField调用没传schema参数),但结合代码上下文来看,问题出在新版本客户端对LoadJobConfig的初始化逻辑做了调整——旧版本允许在构造函数中直接传schema参数,新版本可能对这种传参方式做了限制,或者你的环境中客户端库被意外升级了。

解决方案

这里给你三种可行的修改方式,按简便程度排序:

1. 开启自动Schema检测(最省心)

如果你的DataFrame中Weekend列的类型和BigQuery的INT64匹配,完全可以让BigQuery自动推断Schema,省去手动构造SchemaField的麻烦:

job_config = bigquery.LoadJobConfig(
    write_disposition="WRITE_TRUNCATE",
    autodetect=True
)

job = client.load_table_from_dataframe(
    full_df_at, table_id, job_config=job_config
)
# 等待任务完成
job.result()
print(f'A table {table_id} is created')

2. 改用属性赋值设置Schema

避免在LoadJobConfig构造函数中直接传schema,先初始化配置对象,再手动设置schema属性:

job_config = bigquery.LoadJobConfig()
# 手动赋值schema属性
job_config.schema = [
    bigquery.SchemaField("Weekend", "INT64")
]
job_config.write_disposition = "WRITE_TRUNCATE"

job = client.load_table_from_dataframe(
    full_df_at, table_id, job_config=job_config
)
job.result()
print(f'A table {table_id} is created')

3. 使用官方枚举类型定义字段(最稳定)

如果是SchemaField的参数格式问题(新版推荐用枚举而非字符串),可以改用FieldType枚举来定义字段类型,避免字符串拼写错误:

from google.cloud.bigquery import FieldType

job_config = bigquery.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField("Weekend", FieldType.INTEGER)
]
job_config.write_disposition = "WRITE_TRUNCATE"

job = client.load_table_from_dataframe(
    full_df_at, table_id, job_config=job_config
)
job.result()
print(f'A table {table_id} is created')

注:FieldType.INTEGER对应BigQuery的INT64类型,枚举值比硬编码字符串更稳定,适配未来版本更新。

额外建议

你可以检查一下当前google-cloud-bigquery的版本,确认是不是版本升级导致的API变化:

pip show google-cloud-bigquery

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:37:52