大查询 csv 加载问题

Posted

技术标签:

【中文标题】大查询 csv 加载问题【英文标题】:big query csv load issue 【发布时间】:2019-08-27 00:35:31 【问题描述】:

我最近开始研究 gcp 和 bigquery,一般来说我在使用谷歌云作曲家将 csv 文件从谷歌云存储加载到 BQ 表时遇到以下错误

下面是我正在使用的代码。

t1 = GoogleCloudStorageToBigQueryOperator(
      task_id='gcs_to_bq_mak',
      bucket='bucketname',
      source_objects=['FULL/mak.csv'],
      field_delimiter='|',
      destination_project_dataset_table='0.mak_initial_f'
      .format(BQ_DATASET_NAME),
      schema_fields= mak_schemas.mak_schema(),
      #create_disposition='CREATE_IF_NEEDED',
      skip_leading_rows=1,
      #quote = '""',
      #quote = ''
      #quote = '"'
      #allowQuotedNewlines =  True,
      write_disposition='WRITE_APPEND',
      time_partitioning='Date':'timestamp'
                 )

我的文件是用竖线分隔的。

无论我将引号运算符设置为什么值,我得到的都是以下错误

错误:右双引号 (") 和字段分隔符之间的数据。'], 'state': 'DONE'

我不确定我是否按预期使用了报价选项。

下面是我的工作失败原因的示例行

100|I|50|100010012|F|1" PAE|1-8" PAE|20190|C|1

如您所见,“在分隔符之后是管道,所以我的工作失败了。

是否有任何解决方法我参考了许多帖子都提到使用引号运算符,但这对我不起作用或者我没有正确使用它。

现在如果无法转义字段中的引号,那么我计划将整行作为文本加载到 int 表中

但是我的下一步应该是如何将该单行再次加载回原始表。

我计划实现的示例代码。

t3 = GoogleCloudStorageToBigQueryOperator(
        task_id='mak_load_one_column',
        bucket='bucketname',
        source_objects=['mak.csv'],
        field_delimiter='\t',
        allow_jagged_rows=True,
        destination_project_dataset_table='0.mak_init_singlecolumn'
        .format(BQ_DATASET_NAME),
        schema_fields=["name": "singlecolumn","type": "TEXT","description": 
                      "load all the rows into one column"],
        skip_leading_rows=1,
        write_disposition='WRITE_APPEND',
        #time_partitioning='Date':'timestamp',
        #provide_context=True,
        #trigger_rule=TriggerRule.ALL_FAILED)

但是我如何将数据重新加载到具有正确架构的表中。

任何建议表示赞赏。

问候。

【问题讨论】:

【参考方案1】:

RFC 4180

2.5 每个字段可以用双引号括起来,也可以不用双引号...如果字段没有用双引号括起来,则双引号可能不会出现在字段内。

2.6 包含换行符 (CRLF)、双引号和逗号的字段应该用双引号括起来。

2.7 如果使用双引号将字段括起来,则出现在字段中的双引号必须通过在其前面加上另一个双引号来进行转义。例如:

"aaa","b""bb","ccc"

并非所有内容都完全符合 csv 标准。其他定界符是可以的,并且引用规则可能会有所不同,因此可能存在一个库特定的问题,这两个库之间试图在这里相互通信。 但既然你提到要引用它,我建议尝试这种格式(尽管我只是将每个字段都放在双引号中)

100|I|50|100010012|F|"1"" PAE"|"1-8"" PAE"|20190|C|1

或者如果该管道也应该在现场,也许你是这个意思?

100|I|50|100010012|F|"1"" PAE|1-8"" PAE"|20190|C|1

【讨论】:

您好,感谢您的回复。是的,你是对的,每个双引号都必须以前面的双引号结尾,但我的问题是在我的数据中,数字后的双引号是有意义的。此外,我有超过 1 亿条记录,因此手动编辑或使用脚本是不可行的。将te文件加载到表时有没有办法忽略它。 您可以使用 quote_character 参数,但您可能必须重写所有文件(脚本)。从算法上讲,这不会改变你的大 O。您可能可以将此转换器脚本作为 PythonOperator 插入气流中的中间步骤。 (除了快速查看文档之外,我对气流知之甚少。)【参考方案2】:

对于任何好奇的人,我已将整个记录作为 blob 加载到 int 表中,并从 int 表解析和加载目标表。到目前为止,转义双引号似乎是不可能的。

【讨论】:

【参考方案3】:

我们在这里遇到了同样的问题,通过这样做解决了:

quote_character=""

有趣的是,当我们执行#quote_characterquote_character=None 时它没有得到解决\o/

【讨论】:

以上是关于大查询 csv 加载问题的主要内容,如果未能解决你的问题,请参考以下文章

将 csv 文件从云存储加载到大查询

大查询:出乎意料。请在加载 53GB CSV/1.4GB gZIP 时重试

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

无法将 csv 文件从 GCS 加载到 bigquery

使用云功能将数据加载到大查询表中,它是附加到表中的,我需要它来替换

使用查询将数据从 EXCEL/CSV 加载到 MYSQL?