hive serde 中多分隔符字符串的正则表达式

Posted

技术标签:

【中文标题】hive serde 中多分隔符字符串的正则表达式【英文标题】:regex for multi-delimiter string in hive serde 【发布时间】:2011-12-11 15:10:30 【问题描述】:

我使用 serde 读取带有分隔符 || 的特定格式的数据,而像 ||| 这样的三重管道将永远不会出现在我的数据字符串中。

我的一行数据可能看起来很简单:aaa||bbb||ccc||ddd,然后我创建了如下配置单元表:

CREATE TABLE test_log(
host STRING,
identity STRING,
user STRING,
time STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "([^\\|]*)\\|2([^\\|]*)\\|2([^\\|]*)\\|2([^\\|]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s")
STORED AS TEXTFILE;

读取数据似乎很好,但显然input.regex并不完全正确,当面对一些数据时:a|bc||edf||g|g||ghi。我试图在“掌握正则表达式”一书中寻求帮助,但没有成功。

是否可以仅使用特定的input.regex 读取和提取上述格式的数据?

【问题讨论】:

【参考方案1】:

现在您只捕获由管道对分隔但本身不包含管道字符的组:([^\\|]*)。如果将其更改为((?:[^\\|]+\\|)*[^\\|]+),那么每个组将能够在中间某处包含单个管道(如a|bcgg|g),但不允许以管道开始或结束,因为这会导致歧义(例如:ab|||cd 可以分为ab|cdab|cd)。

【讨论】:

【参考方案2】:

我似乎找到了使用regex look around 的解决方案。

对于像"a|b|c||d|e|f||g|h|i"这样的数据,我可以用

读取字符串

"input.regex" = "(.*)(?=\\|\\|)\\|2(.*)(?=\\|\\|)\\|2(.*)"

效果很好,图案清晰。

【讨论】:

以上是关于hive serde 中多分隔符字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Hive with Regex SerDe 拆分行,每个单词成为一列

如何在 Hive 中构建正则表达式以获取字符串,直到第 N 次出现分隔符

Amazon Hive 中的多分隔符 SerDe 设置

在 Hive 中使用 Regex Serde 创建表返回错误

Hive SQL DDL语法 - 指定分隔符指定存储路径

Hive正则表达式