我最近开始研究 gcp 和 bigquery 一般我在使用 Google 云作曲家将 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'}
)
我的文件由竖线分隔。
无论我将报价运算符设置为什么值,我得到的都是以下错误
错误:右双引号 (") 和字段分隔符之间的数据。'}], '状态': '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)
但是如何将数据重新加载到具有正确架构的表中。
任何建议表示赞赏。
问候。
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
对于任何好奇的人,我已经将整条记录作为 blob 加载到 int 表中,并从 int 表中解析和加载目标表。 到目前为止,转义双引号似乎是不可能的。
我们在这里遇到了同样的问题,通过执行以下操作来解决:
quote_character=""
有趣的是,当我们做#quote_character
或quote_character=None
\o/时它没有得到解决