如何让含新增列的CSV文件共用同一BigQuery外部表?
解决BigQuery外部表兼容新旧CSV列数的问题
不需要手动修改旧文件,完全可以通过任务配置实现需求,具体做法如下:
定义完整的19列表结构
在BigQueryUpsertTableOperator的配置里,直接指定包含19列的schema,注意第19列的mode保持默认的NULLABLE即可(除非你之前特意设为REQUIRED,需要改回来)。比如按实际数据类型定义最后一列:{"name": "new_column", "type": "INT64", "mode": "NULLABLE"}。配置CSV读取参数
核心是开启allow_jagged_rows参数,这个参数允许CSV文件的列数少于表定义的列数,缺少的列会自动填充为NULL。同时根据你的文件情况补充其他参数:比如文件有表头就设skip_leading_rows: 1,分隔符不是逗号就调整field_delimiter。示例配置代码
给你一个Airflow任务的参考示例:from airflow.providers.google.cloud.operators.bigquery import BigQueryUpsertTableOperator setup_unified_external_table = BigQueryUpsertTableOperator( task_id="setup_bq_unified_table", dataset_id="your_target_dataset", table_id="unified_external_table", table_resource={ "schema": { "fields": [ {"name": "col1", "type": "STRING"}, # 依次填入前18列的字段定义 {"name": "new_col_19", "type": "STRING"} # 第19列,默认允许为NULL ] }, "externalDataConfiguration": { "sourceUris": ["gs://your_gcs_bucket/**/*.csv"], # 匹配所有新旧CSV文件 "sourceFormat": "CSV", "csvOptions": { "allowJaggedRows": True, "skipLeadingRows": 1, # 有表头设1,无表头设0 "fieldDelimiter": "," } } }, gcp_conn_id="your_gcp_connection" )验证结果
任务执行完成后,查询这个外部表,旧文件对应的第19列会自动显示为NULL,新文件的第19列则会加载对应的数据,完全符合需求。
内容的提问来源于stack exchange,提问作者unnest_me
相关产品推荐
相关产品推荐

