BigQuery 从多个文件创建外部表,所有文件共享相同的 18 列,但较新的文件有一个额外的列

BigQuery Create External table from multiples files all files share same 18 columns, except newer files have one extra column

提问人:unnest_me 提问时间:10/13/2023 更新时间:10/14/2023 访问量:88

问:

我有一个情况,我想知道如果可能的话。我目前有一个BigQueryUpsertTableOperator,它转到谷歌云存储并从其中的所有csv文件创建一个外部表。所有这些文件共享完全相同的 18 列,它们只是不同的数据,每天有一个新文件进来。最近,较新的文件增加了额外的第 19 列。是否仍允许将所有这些文件创建到同一个外部表中?有某种方法可以使这些值在新文件中仅为 null?

 create_external_table = BigQueryUpsertTableOperator(
    task_id=f"create_external_{TABLE}_table",
    dataset_id=DATASET,
    project_id=INGESTION_PROJECT_ID,
    table_resource={
        "tableReference": {"tableId": f"{TABLE}_external"},
        "externalDataConfiguration": {
            "sourceFormat": "CSV",
            "allow_quoted_newlines": True,
            "allow_jagged_rows":True,
            "autodetect": True,
            "sourceUris": [f"gs://{ARCHIVE_BUCKET}/{DATASET}_data/*.csv"],
        },
        "labels": labeler.get_labels_bigquery_table_v2(
            target_project=INGESTION_PROJECT_ID,
            target_dataset=DATASET,
            target_table=f"{TABLE}_external",
        ),
    },
)

我是否需要手动进入这些旧文件并在每条记录的末尾添加逗号,并在第一行添加新列名,以便将它们与新文件并排摄取,或者以任何方式在任务中为此设置选项?

csv bigquery 谷歌- 云-存储 外部表

评论


答:

0赞 Nestor 10/14/2023 #1

我已经复制了您的担忧,看起来您必须编辑以前的数据以适合您收到的新文件。

使用带有新列的 csv 更新插入进行查询时出现错误:

enter image description here

但请注意,您不能直接通过存储桶中的 GCS 文件进行编辑:

对象是由任何格式的文件组成的不可变数据片段

您可以在 bash 中使用 awk 命令或在 python 中使用数据帧在 csv 上添加新列,我相信还有很多其他方法。

0赞 Roar S. 10/14/2023 #2

您可以将 #19 列的架构定义为可为 null。请注意更改。"autodetect": False

"externalDataConfiguration": {
    "sourceFormat": "CSV",
    "allow_quoted_newlines": True,
    "allow_jagged_rows":True,
    "autodetect": False,
    "sourceUris": [f"gs://{ARCHIVE_BUCKET}/{DATASET}_data/*.csv"],
    "schema": {
        "fields": [
            {
              "name": "Column1",
              "type": "STRING",
              "mode": "REQUIRED"
            },
            ...
            {
              "name": "Column19",
              "type": "STRING"
            }
        ]
    }  
}

文档 ExternalDataConfiguration

为外部数据源创建表定义文件