我有一个情况,我想知道是否有可能打击.我目前有一个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",
),
},
)
字符串
我是否需要手动进入这些旧文件,并在每条记录的末尾添加一个逗号,并在第一行添加新的列名,以便与新文件并排摄取这些文件,或者在任务中设置一个选项?
2条答案
按热度按时间zpqajqem1#
我已经复制了你的关注,它看起来像你将不得不编辑你以前的数据,以适应您正在接收的新文件。
在csv中查询时出现错误,并添加了新列:
的数据
但请注意,您不能直接通过存储桶中的GCS文件进行编辑:
对象是由任何格式的文件组成的不可变的数据片段
你可以使用bash中的
awk
命令或python中的嵌套框在csv上添加新列,我相信还有很多其他方法。pw9qyyiw2#
您可以将自己的模式与列#19定义为可空。请注意更改
"autodetect": False
。字符串
单据外部数据配置
为外部数据源创建表定义文件