提问人:unnest_me 提问时间:10/13/2023 更新时间:10/14/2023 访问量:88
BigQuery 从多个文件创建外部表,所有文件共享相同的 18 列,但较新的文件有一个额外的列
BigQuery Create External table from multiples files all files share same 18 columns, except newer files have one extra column
问:
我有一个情况,我想知道如果可能的话。我目前有一个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赞
Nestor
10/14/2023
#1
我已经复制了您的担忧,看起来您必须编辑以前的数据以适合您收到的新文件。
使用带有新列的 csv 更新插入进行查询时出现错误:
但请注意,您不能直接通过存储桶中的 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"
}
]
}
}
评论