CSV 行中的最后一个字段留空,出现错误:CSV 表引用列位置 19,但从 position:325 开始的行仅包含 19 列

Last Field in a CSV row left empty giving error: CSV table references column position 19, but line starting at position:325 contains only 19 columns

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

问:

我有一个 DAG 气流任务,它进入一个特定的存储桶,并从里面的所有文件一起创建一个外部表。尝试在 bigquery 中查询外部表时,我收到错误(CSV 表引用列位置 19,但从 position:325 开始的行仅包含 19 列)。我已经查看了它提到的特定文件,第一行(和其他)中的最后一个字段留空,如果它什么都没有,它应该是 0,如果有的话,则留一个数字。我该如何解决这个问题?

文件中的示例记录:

enter image description here

我已经滚动了,所以你可以看到最后一列(第 19 列是总件数),所有其他记录在此字段中都有一个数字,甚至是 0。第一条记录以及一些其他记录什么都没有。我可以想象这在其他文件中也可能再次发生,所以我不能手动修复它们。

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,
            "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 google-bigquery airflow 外部表

评论

0赞 Rafa 10/10/2023
您好,您可以在上游任务中用空值填充空白吗?写入文件的进程可以处理这个问题吗?
0赞 unnest_me 10/10/2023
@Rafa这些文件是从外部供应商发送的。我可以创建一个PySpark作业来打开每个文件并将所有空值填充为null或0,只是想看看是否有任何其他选项可以这样做。
0赞 Rafa 10/12/2023
在不使用运算符的情况下,您可以将其加载到 pandas 中并使用该方法填充空白,然后将文件写回 s3,不确定执行此操作的最佳方法或您有多少文件。这绝对是低效的。fillna
0赞 Rafa 10/12/2023
还有一些关于在没有 BigQuery 运算符的情况下处理此问题的文档。不确定这些是否适合您的用例 cloud.google.com/bigquery/docs/...

答:

0赞 unnest_me 10/13/2023 #1

任务“allow_jagged_rows”选项允许在创建外部表时正常引入最后一列中缺少数据的记录。或者任何与此相关的表,我的新任务如下所示:

 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, ##Added option
            "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",
        ),