如何在BigQuery加载Parquet文件时强制所有字段为STRING类型
问题根因
你当前使用的--parquet_enum_as_string=true和--decimal_target_types=STRING参数仅支持枚举、十进制类型的字符串转换,Parquet原生的FLOAT、INT、BOOLEAN等数值/布尔类型会默认按原始类型解析,和你提前创建的全STRING类型表的schema不匹配,因此触发报错。
你往不存在的表导入时没有提前的schema约束,BigQuery会直接按Parquet解析出的字段类型建表,因此不会触发类型冲突报错。
解决方案
方案1(推荐):新增全字段转STRING参数
BigQuery提供了--parquet_all_fields_as_string参数,开启后会将Parquet文件中所有类型的字段统一解析为STRING类型,完全匹配你的需求,修改后的加载命令如下:
bq load --source_format=PARQUET --noreplace --noautodetect --parquet_all_fields_as_string=true [project]:[dataset].[tables] gs://[bucket]/[file].parquet
该参数优先级最高,开启后无需再额外配置枚举、十进制转字符串的相关参数,嵌套结构、数组中的叶子字段也会统一转换为STRING类型。
方案2:显式指定schema加载
如果你使用的BigQuery版本不支持上述参数,可以通过显式指定表schema的方式加载:
- 先导出你提前创建的全STRING类型表的schema文件:
bq show --schema --format=prettyjson [project]:[dataset].[table] > schema.json
- 加载时指定schema文件,命令如下:
bq load --source_format=PARQUET --noreplace --noautodetect --schema=schema.json [project]:[dataset].[tables] gs://[bucket]/[file].parquet
内容的提问来源于stack exchange,提问作者Ailyc
相关产品推荐
相关产品推荐

