无法将字段中带有 \" 的数据提取到 BigQuery 中

Posted

技术标签:

【中文标题】无法将字段中带有 \\" 的数据提取到 BigQuery 中【英文标题】:No Way to Ingest Data With \" in a Field Into BigQuery无法将字段中带有 \" 的数据提取到 BigQuery 中 【发布时间】:2019-09-20 20:44:41 【问题描述】:

我每天都有数以万计的压缩 CSV 文件写入 S3。它们包含逗号分隔的字段,每个字段都用双引号括起来(无论数据类型如何)。但是,字段中包含的双引号会使用 \ 而不是 RFC4180 标准 " 转义,如下所示:

header1,header1,header3
"1","Look some text.","43.7"
"2","27\" TV","29.1"
"3","More things","99.0"

这适用于 Amazon Athena 或其他使用反序列化程序的产品,这些反序列化程序可让您指定引号/转义字符。但是,BigQuery 无法提取此数据。我收到错误:

Error: Data between close double quote (\") and field separator.

当我尝试时,这是有道理的。我无法更改底层数据结构(由另一个服务编写),将 configuration.load.quote 参数设置为未使用的字符会给我解析错误,并且启动 Cloud SQL 实例来充当解析器是不可行的(我' m 每天处理 TB 的数据)。

我认为将引号字符设置为 \" 可能有效,但 BQ API 只允许该字段使用单个字符。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

我理解痛苦,感谢您提供额外的动力!

正如我在帖子 (https://medium.com/google-cloud/loading-mysql-backup-files-into-bigquery-straight-from-cloud-sql-d40a98281229) 中所解释的,我发现目前处理此问题的最简单方法是通过 MySQL。

有关 Stack Overflow 的其他问题显示了替代路径,例如使用 Dataflow、bash 工具和/或 BigQuery 内部进行预处理。

关于产品功能开发,请订阅并点赞本期——在此添加您的 cmets 也将非常有价值:

https://issuetracker.google.com/issues/35906027

要在 BigQuery 中解析,请尝试加载每一行原始数据并像这样运行 UDF:

SELECT csv.cols[SAFE_OFFSET(0)] a
  , csv.cols[SAFE_OFFSET(1)] b
  ,csv.cols[SAFE_OFFSET(2)] c
  ,csv.cols[SAFE_OFFSET(3)] d
  ,csv.cols[SAFE_OFFSET(4)] e
  ,csv.cols[SAFE_OFFSET(5)] f
FROM (
  SELECT fhoffa.x.parse_csv('hello,"dealing here, with", some \" quoted words, all is fine, good one?,"even a , in between"')  csv
)

参考:https://medium.com/@hoffa/new-in-bigquery-persistent-udfs-c9ea4100fd83

【讨论】:

以上是关于无法将字段中带有 \" 的数据提取到 BigQuery 中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Presto JSON 函数访问字段名称中带有“~”的 json 字段

如何将字符串中带有双引号的json文件加载到spark scala中的数据框中

无法在类型“y”上查询字段“x”

在EXCEL中,如何根据关键字批量提取单元格所在行的内容?

如何使用python提取json中指定字段的数据

如何用bat拷贝文件名中带有“ast”的文件