AWS Athena 中的 Regex Serde 可以处理换行符吗?

问题描述

我有一个表格,其中有几列包含数据中的换行符。我曾尝试使用 glue Crawler 在 Athena 中创建表,但由于换行符,这些值溢出到错误的列中。源数据是 S3 存储桶中的 CSV

现在我试图通过使用 Regex SerDe 创建一个表来实现相同的目标。我的问题是我无法处理数据中的换行符。我读了这篇文章How to handle new line characters in hive? 并想知道下面是否仍然如此:

您不能将用换行符分隔的记录放入 Hive,换行符在数据本身中包含换行符。至少,不是纯文本。否则,您需要使用 sqoop 来解析和加载正确的列 – OneCricketeer 2018 年 3 月 4 日 7:24

没有换行符的简单源数据示例,有效: “这是一个句子,用逗号,很棒”,“亲切的问候,约翰”

“这是另一个带逗号的句子,不太好”,您好

两列两行,下面是有效的正则表达式:

CREATE EXTERNAL TABLE `commas_regex`(
  `col1` string COMMENT '',`col2` string COMMENT '')
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.regexserde' 
WITH SERDEPROPERTIES ( 
  'input.regex'='(\"*[\\w|,|\\s|\\n|\\r]+\"*),(\"*[\\w|,|\\s\\n|\\r]+\"*)$[\\r\\n]*') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeytextoutputFormat'
LOCATION
  's3://....' /* removed for security */ 
TBLPROPERTIES (
  'has_encrypted_data'='false','transient_lastDdlTime'='1623409617')

现在更改源数据以包含换行符,它停止工作:

“这是一个句子,用逗号,很棒”,“亲切的问候,

约翰”

“这是另一个带逗号的句子,不太好”,您好 See picture of the results in Athena here

解决方法

根据我的研究,hive serde 目前不支持嵌入的换行符。

https://community.cloudera.com/t5/Support-Questions/Hive-Regex-Serde-for-Multiple-Line/td-p/37097

“当前 Hive 不支持识别文本格式数据中嵌入的换行符,即使通过其 OpenCSV 实现”

,

只有像 ORCParquet 这样的二进制格式可以存储换行符,并且在查询中您可以仅在使用二进制格式时使用正则表达式检查换行符,此外,如果您没有在查询中删除一些工具可能会将带有换行符的行显示为几个不同的行,但这可能不是您的工具的问题。

像 TEXTFILE、JSON 这样的文本格式不应该包含换行符,因为行是逐行处理的,将换行符视为行分隔符。

对于 JSON,事情变得更加复杂。 JSON 可以包含 \n \r \t 组合,根据 JSON 规范,这些组合被 JSONSerDe 解释为换行符、回车符和制表符,这就是为什么你需要注意这些使用 JSONSerDe 时,还应该注意像 \\n \\t \\r 这样的组合,因为它们将在输出期间被解释。最好用任意数量的斜杠以及换行符、制表符、CR 删除所有此类组合。