BigQuery插入JSON数据时纯数字字符串被自动转int的解决方法咨询
解决方案
方案1:显式指定导入Schema(最稳定,推荐)
你已经关闭了自动类型检测,但未显式指定导入Schema时,BigQuery仍会对JSON字段做隐式类型推断,导致纯数字字符串被识别为整数。你可以在LoadJobConfig中显式声明和目标表完全一致的Schema,强制指定field_string为STRING类型,从根源上禁止自动类型转换。
修改后的配置示例如下:
from google.cloud import bigquery from google.cloud.bigquery import SchemaField # 按目标表实际结构补全所有字段的定义,类型、顺序、空属性要和目标表完全对齐 target_schema = [ SchemaField("field_string", "STRING", mode="NULLABLE"), # 示例:其他字段配置 # SchemaField("id", "INTEGER", mode="REQUIRED"), # SchemaField("create_time", "TIMESTAMP", mode="NULLABLE"), ] job_config = bigquery.LoadJobConfig( autodetect=False, write_disposition=bigquery.WriteDisposition.WRITE_APPEND, source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON, max_bad_records=10, ignore_unknown_values=False, schema=target_schema, # 新增:指定导入Schema )
方案2:开启引号值强制识别为字符串(无需定义全量Schema,适配快速开发)
如果不想手动维护全量Schema,可以直接添加quoted_values_are_strings=True配置项,开启后BigQuery会将JSON中所有被双引号包裹的值统一识别为STRING类型,不会再把纯数字内容的字符串推断为整数,完全符合你的需求。
修改后的配置示例如下:
job_config = bigquery.LoadJobConfig( autodetect=False, write_disposition=bigquery.WriteDisposition.WRITE_APPEND, source_format=bigquery.SourceFormat.NEWLINE_DELIMITED_JSON, max_bad_records=10, ignore_unknown_values=False, quoted_values_are_strings=True, # 新增:引号包裹的值强制识别为字符串 )
注意事项
- 两种方案都不需要修改原始JSON数据,无需额外添加符号,存入BigQuery的
field_string值和你输入的原始内容完全一致 quoted_values_are_strings参数只会影响带双引号的字段值,本身不带引号的数值、布尔类型字段不受影响,会正常识别为对应类型
内容的提问来源于stack exchange,提问作者Ivania Donoso Guzmán
相关产品推荐
相关产品推荐

