代码之家  ›  专栏  ›  技术社区  ›  unnest_me

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

  •  0
  • unnest_me  · 技术社区  · 2 年前

    我有一种情况,如果可能的话,我想知道。我目前有一个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",
            ),
        },
    )
    

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

    0 回复  |  直到 2 年前
        1
  •  0
  •   Nestor    2 年前

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

    使用csv查询时出现错误,并使用新列打乱排序:

    enter image description here

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

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

    您可以使用在csv上添加新列 awk bash中的命令或使用 dataframes 在蟒蛇和我相信许多其他方式。

        2
  •  0
  •   Roar S.    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"
                }
            ]
        }  
    }
    

    Doc ExternalDataConfiguration

    Create a table definition file for an external data source

    推荐文章