使用多字符分隔符创建 HIVE 表

Posted

技术标签:

【中文标题】使用多字符分隔符创建 HIVE 表【英文标题】:Create HIVE Table with multi character delimiter 【发布时间】:2013-09-21 10:15:55 【问题描述】:

我想创建一个以多字符串字符作为分隔符的 HIVE 表,例如

CREATE EXTERNAL TABlE tableex(id INT, name STRING) 
ROW FORMAT delimited fields terminated by ','
LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/user/myusername';

我想将分隔符作为多字符串,如“~*”。

【问题讨论】:

再一次,一个带有多余全大写标题的 SQL 问题。天哪。 【参考方案1】:

FILELDS TERMINATED BY 不支持多字符分隔符。最简单的方法是使用RegexSerDe

CREATE EXTERNAL TABlE tableex(id INT, name STRING) 
ROW FORMAT 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "^(\\d+)~\\*(.*)$"
)
STORED AS TEXTFILE 
LOCATION '/user/myusername';

【讨论】:

谢谢 Hari,我知道 SerDe。但是 SerDe 的问题是我无法使用 Hive 表在 SSMS 上创建链接服务器连接。你如何解决这个问题? 我没有在 SSMS 上工作过,所以我不能确定。但是为什么你认为这是 SerDe 的问题?我认为这是一个单独的问题,不是吗? 我遇到了类似的问题,并且能够使用此答案成功构建表,但在查询时遇到了聚合问题。一些挖掘,我最终通过将“org.apache.hadoop.hive.contrib.serde2.RegexSerDe”更改为“org.apache.hadoop.hive.serde2.RegexSerDe”来解决【参考方案2】:

请使用MultiDelimitSerde

CREATE EXTERNAL TABlE tableex(id INT, name STRING) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
WITH SERDEPROPERTIES ("field.delim"="~*")
STORED AS TEXTFILE
LOCATION '/user/myusername';

【讨论】:

是 csv serde 吗,能处理多行 cmets 的字段吗?如果字段用反斜杠转义,并且字段用双引号括起来。

以上是关于使用多字符分隔符创建 HIVE 表的主要内容,如果未能解决你的问题,请参考以下文章

Hive load外部文件时如何区别分隔符与文本内容

使用正则表达式将字段拆分为数组的 Bash 脚本用于多字符分隔符

想要编写(或使用现有的?)UDF 来读取具有多字符分隔符的文件

hive学习笔记_hive的表创建

Hive多分隔符支持示例

Hive多分隔符支持示例