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

omhiaaxx  于 7个月前  发布在  其他
关注(0)|答案(2)|浏览(98)

我有一个情况,我想知道是否有可能打击.我目前有一个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",
        ),
    },
)

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

zpqajqem

zpqajqem1#

我已经复制了你的关注,它看起来像你将不得不编辑你以前的数据,以适应您正在接收的新文件。
在csv中查询时出现错误,并添加了新列:


的数据
但请注意,您不能直接通过存储桶中的GCS文件进行编辑:
对象是由任何格式的文件组成的不可变的数据片段
你可以使用bash中的awk命令或python中的嵌套框在csv上添加新列,我相信还有很多其他方法。

pw9qyyiw

pw9qyyiw2#

您可以将自己的模式与列#19定义为可空。请注意更改"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"
            }
        ]
    }  
}

字符串
单据外部数据配置
为外部数据源创建表定义文件

相关问题