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

Python加载pandas整数数组至BigQuery时数组为空问题咨询

问题现象

尝试将pandas DataFrame中的整数数组加载到BigQuery时,加载任务正常执行完成,但目标表内的数组字段为空,数组中存储的所有整数值全部丢失,现象如下:
BigQuery数组字段为空问题截图

复现代码如下:

tableId = test-dev.xpto.array
df = pd.DataFrame()
    df['name'] = ['city']
    df['channels'] = [[1, 13, 36]]

schema = [
    bigquery.SchemaField("name", "STRING", mode="NULLABLE"),
    bigquery.SchemaField("channels", "INT64", mode="REPEATED")
]
job_config = bigquery.LoadJobConfig(
        schema=schema,
        create_disposition="CREATE_IF_NEEDED",
        write_disposition="WRITE_APPEND",
    )

job = client.load_table_from_dataframe(
            df, table_id, job_config=job_config
        )
问题根因

核心疏漏是未处理pandas数组列的序列化类型适配问题:
load_table_from_dataframe方法默认使用Parquet作为中间传输格式,序列化阶段依赖pyarrow做类型转换。代码中channels列存储的是Python原生列表,pandas会把该列识别为object类型,旧版BigQuery客户端无法自动将object类型的列表值映射为BigQuery的REPEATED类型字段,序列化时会直接丢弃列值,且不会抛出显性错误,最终表现为作业执行成功但数组字段为空。显式传入schema仅会在BigQuery服务端做加载校验,无法修正客户端本地序列化阶段的数值丢失问题。

排查思路
  • 先校验DataFrame字段类型:执行print(df.dtypes),可观察到channels列类型为object,不属于BigQuery客户端可自动识别的数组类型
  • 检查加载作业详情:调用job.result()后打印job.load_statistics,或去BigQuery控制台查看对应作业的加载日志,可看到REPEATED字段的写入值统计为0,无显式报错
  • 做最小场景验证:将channels列替换为字符串列表、浮点数列表重复加载测试,会发现所有object类型的列表列都存在空值问题,确认是序列化适配问题而非整数类型专属问题
修复方案

以下方案任选其一即可:

  • 显式转换为pyarrow数组类型(最稳定推荐)
    提前将数组列转为pyarrow原生的列表类型,让Parquet序列化阶段可直接识别类型,无需修改原有schema配置:
    import pyarrow as pa
    
    # 构造DataFrame后增加类型转换步骤
    df = pd.DataFrame()
    df['name'] = ['city']
    df['channels'] = [[1, 13, 36]]
    # 将列表列转为pyarrow int64数组类型
    df['channels'] = df['channels'].apply(lambda x: pa.array(x, type=pa.int64()))
    
    # 后续加载逻辑保持不变即可
    
  • 修改加载源格式绕过Parquet序列化
    在作业配置中指定源格式为换行符分隔JSON,跳过Parquet序列化环节,直接按JSON结构解析列表值:
    job_config = bigquery.LoadJobConfig(
        schema=schema,
        create_disposition="CREATE_IF_NEEDED",
        write_disposition="WRITE_APPEND",
        # 新增源格式配置
        source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
    )
    
  • 升级依赖版本修复已知bug
    升级google-cloud-bigquery到3.0以上版本、pyarrow到6.0以上稳定版,新版本对pandas object类型的列表列做了自动适配,部分简单场景下无需手动做类型转换即可正常加载。

注意:不要直接将numpy数组存入DataFrame的数组列,numpy整数类型与BigQuery INT64存在序列化适配差异,容易出现值截断或类型不匹配错误,建议转为原生Python int列表或pyarrow数组后再写入

内容的提问来源于stack exchange,提问作者Rui Bras Fernandes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:36:20