大查询csv加载问题

时间:2019-08-27 00:35:31

标签: python google-bigquery airflow google-cloud-composer

我最近开始着手于gcp和bigquery的使用,我在使用Google Cloud Composer将CSV文件从Google云端存储加载到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'}
                 )

我的文件用竖线分隔。

无论我将引号运算符设置为什么值,都会出现以下错误

错误:双引号(“)和字段分隔符之间的数据。'}],'状态':'DONE'}}

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

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

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)

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

任何建议表示赞赏。

致谢。

3 个答案:

答案 0 :(得分:0)

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 :(得分:0)

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

答案 2 :(得分:0)

我们在这里遇到了同样的问题,可以通过以下方法解决:

quote_character=""

有趣的是,当我们完成#quote_characterquote_character=None \ o /

时,它并没有解决