Hive CSV 行分隔符配置

Posted

技术标签:

【中文标题】Hive CSV 行分隔符配置【英文标题】:Hive CSV line delimiter configuration 【发布时间】:2019-08-01 21:21:21 【问题描述】:

使用 Hive 在 CSV 文件上创建外部表时, 您可以使用 Hive 内部的 CSV Serde:

...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '...'
TBLPROPERTIES('serialization.null.format'='')

或 OpenCSV Serde:

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ( "separatorChar" = " ", "quoteChar" = '"', "escapeChar" = "\\" )

我的问题是,如果我有这样的 CSV 文件:

foo,bar,hello\rworld\rbaz,1\n
foo,bar,bye\rworld\rbaz,2\n
foo,bar,hi\rworld\rbaz,3\n
foo,bar,goodbye\rworld\rbaz,4\n

如何将行尾配置为 \n 并忽略 \r - 将其保留为字段的一部分?


编辑:

-> 尝试使用LINES TERMINATED BY '\r\n' 时出现以下错误:

org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: SemanticException 3:20 LINES TERMINATED BY only supports newline '\n' right now. Error encountered near token ''\r\n''

【问题讨论】:

【参考方案1】:

您可以在create table 语句中使用LINES TERMINATED BY,如下所示:

...
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '...'
TBLPROPERTIES('serialization.null.format'='')

【讨论】:

感谢您的回答!让我确认它是否有效,我会回来并将其标记为已解决! 很抱歉,尽管看起来很简单,但使用 LINES TERMINATED BY '\n' 时 Hive 的行为并没有什么不同。 应该可以,有很多这样的例子,你可以在这里找到一个:tutorialspoint.com/hive/hive_create_table.htm,我试过了,它对我有用。 我能够观察到两个效果:首先,即使使用LINES TERMINATED BY '\n',Hive 仍然将\r 视为行分隔符,当从语句中完全删除这一行时也会发生同样的情况!其次,这可能是最重要的一个,Hive 实际上会使语句中包含除\n 之外的其他内容的查询失败。我也不是唯一遇到这种情况的人。请参阅this link 作为参考。根据这些发现,我得出结论,该行当前完全不起作用,将被反序列化器忽略... 你能试试LINES TERMINATED BY '\r\n'吗?

以上是关于Hive CSV 行分隔符配置的主要内容,如果未能解决你的问题,请参考以下文章

hive导入到clickhouse的几种方式总结

在 hive 的一列中加载具有“(双引号)的管道分隔 CSV 数据

将CSV文件导入到hive数据库

hive_建表及导入数据

hive导入csv文件,字段中双引号内有逗号

hive 行分隔符怎么指定? 有指定的必要吗?