如何解决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 实现”
,只有像 ORC
、Parquet
这样的二进制格式可以存储换行符,并且在查询中您可以仅在使用二进制格式时使用正则表达式检查换行符,此外,如果您没有在查询中删除一些工具可能会将带有换行符的行显示为几个不同的行,但这可能不是您的工具的问题。
像 TEXTFILE、JSON 这样的文本格式不应该包含换行符,因为行是逐行处理的,将换行符视为行分隔符。
对于 JSON,事情变得更加复杂。 JSON 可以包含 \n
\r
\t
组合,根据 JSON 规范,这些组合被 JSONSerDe 解释为换行符、回车符和制表符,这就是为什么你需要注意这些使用 JSONSerDe 时,还应该注意像 \\n
\\t
\\r
这样的组合,因为它们将在输出期间被解释。最好用任意数量的斜杠以及换行符、制表符、CR 删除所有此类组合。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。