基于GCS分区Parquet文件创建BigQuery外部表报错求助
问题:BigQuery基于分区Parquet创建外部表时出现列重名报错
执行以下SQL在BigQuery中创建基于GCS分区Parquet的外部表:
CREATE OR REPLACE EXTERNAL TABLE `project-id.poc.parquet_test` WITH PARTITION COLUMNS OPTIONS ( uris = ['gs://poc/beam_parquet_poc_ii/*.parquet'], format = 'PARQUET', hive_partition_uri_prefix = 'gs://poc/beam_parquet_poc_ii', require_hive_partition_filter = false);
报错信息:
Error while reading table: parquet_test, error message: Failed to add partition key CREATED_DATE (type: TYPE_DATE) to schema, because another column with the same name was already present. This is not allowed. Full partition schema: [CREATED_DATE:TYPE_DATE, PIPELINE_NAME:TYPE_STRING].
GCS数据存储路径示例:
gs://poc/beam_parquet_poc_ii/CREATED_DATE=2023-08-17/PIPELINE_NAME=poc-1692308092558/00000-of-00002.parquet gs://poc/beam_parquet_poc_ii/CREATED_DATE=2023-08-17/PIPELINE_NAME=poc-1692308092558/00001-of-00002.parquet
Parquet文件内部数据示例:
TRANSACTION_ID EVENT_ID 0 2cd36716-5e36-4924-9895-812a19d9c64e 3688390 STORE_NBR ITEM_NBR 5649 654509568 PIPELINE CREATED_DATE poc-1692308092558 2023-08-17
疑问:是否分区列不能同时存在于Parquet文件内部?如何解决?
解决方案
核心原因
是的,分区列不能同时存在于Parquet文件内部。BigQuery会自动从Hive风格的路径中提取分区列(如路径中的CREATED_DATE、PIPELINE_NAME)并添加到表的schema中,如果Parquet文件内部已经包含同名列(比如这里的CREATED_DATE),就会触发列重名冲突报错。
解决方法
方法1:修改Parquet生成逻辑,移除内部重复列
在生成Parquet文件时,不要将路径中作为分区的字段(CREATED_DATE)写入文件内部,只保留业务相关列(如TRANSACTION_ID、EVENT_ID等)。这样BigQuery提取路径分区列后,schema中不会出现重复列,无需修改建表语句即可正常创建外部表。
方法2:手动指定表schema,排除内部重复列
如果无法修改Parquet文件,可以在创建外部表时手动定义schema,明确只包含需要的业务列,忽略Parquet内部的重复分区列。示例SQL如下:
CREATE OR REPLACE EXTERNAL TABLE `project-id.poc.parquet_test`( TRANSACTION_ID STRING, EVENT_ID INT64, STORE_NBR INT64, ITEM_NBR INT64, PIPELINE STRING -- 保留Parquet内部的PIPELINE列,与路径中的PIPELINE_NAME分区列不重名 ) WITH PARTITION COLUMNS OPTIONS ( uris = ['gs://poc/beam_parquet_poc_ii/*.parquet'], format = 'PARQUET', hive_partition_uri_prefix = 'gs://poc/beam_parquet_poc_ii', require_hive_partition_filter = false );
注:路径中的PIPELINE_NAME分区会生成同名表列,与Parquet内部的PIPELINE列名称不同,不会产生冲突,可根据需求选择是否保留。
内容的提问来源于stack exchange,提问作者Frank Pinto
相关产品推荐
相关产品推荐

