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

时间:2017-12-22 05:19:37

标签: 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/'

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

rec1 col1,rec2 col2
rec2 col1,"rec2, col2"
rec3 col1,"rec3
col2"

当我运行数据预览请求SELECT * FROM "default"."test_line_breaks" limit 10;时,Athena会返回以下响应: Athena query response

如何设置ROW FORMAT以正确处理字段值中的换行符?因此rec3\ncol2中会显示col2

1 个答案:

答案 0 :(得分:6)

这里的问题是OpenCSV Serializer-Deserializer

  

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

请参阅this documentation from AWS

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

编辑:仍在处理嵌入换行符\n的语法。但是,这是一个使用可选引号处理两列的示例。以下正则表达式"*([^"]*)"*,"*([^"]*)"* worked在您的线上带有嵌入式返回托架。但是,我认为 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';