如何处理AWS Athena中的嵌入换行符

ant*_*lim 4 amazon-web-services amazon-athena

我在AWS Athena中创建了一个表,如下所示:

CREATE EXTERNAL TABLE IF NOT EXISTS default.test_line_breaks (
  col1 string, 
  col2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
 'separatorChar' = ',',
 'quoteChar' = '\"',
 'escapeChar' = '\\'
)
STORED AS TEXTFILE
LOCATION 's3://bucket/test/'
Run Code Online (Sandbox Code Playgroud)

在桶中我放了一个简单的CSV文件,其中包含以下内容:

rec1 col1,rec2 col2
rec2 col1,"rec2, col2"
rec3 col1,"rec3
col2"
Run Code Online (Sandbox Code Playgroud)

当我运行数据预览请求时,SELECT * FROM "default"."test_line_breaks" limit 10;Athena会返回以下响应: 雅典娜查询回复

我应该如何设置ROW FORMAT正确处理字段值中的换行符?所以rec3\ncol2出现在col2.

Zer*_*odf 6

这里的问题是OpenCSV Serializer-Deserializer

不支持CSV文件中的嵌入式换行符.

请参阅AWS的此文档.

但是,也许可以使用RegexSerDe.请记住,这个Deserializer将采用" Java Flavored "正则表达式.因此,请确保在调试中使用支持该语法的在线Regex工具.

编辑:仍在处理嵌入式换行的语法\n.但是,这是一个使用可选引号处理两列的示例.下面的正则表达式"*([^"]*)"*,"*([^"]*)"* 的工作对你行与嵌入式回报马车.但是,我认为 Presto引擎只是喂它rec3 col1,"rec3.我继续努力.

CREATE EXTERNAL TABLE IF NOT EXISTS default.test_line_breaks (
  col1 string, 
  col2 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = '"*([^"]*)"*,"*([^"]*)"*'
)
STORED AS TEXTFILE
LOCATION 's3://.../47936191';
Run Code Online (Sandbox Code Playgroud)