将DataFrame写入BigQuery表时遇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

