我在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会返回以下响应:
如何设置ROW FORMAT
以正确处理字段值中的换行符?因此rec3\ncol2
中会显示col2
。
答案 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';