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

时间:2011-12-11 15:10:30

标签: java regex hive

我使用serde以分隔符||读取具有特定格式的数据,而|||之类的三管将永远不会出现在我的数据字符串中。

我的一行数据可能看起来很可爱:aaa||bbb||ccc||ddd,我创建了一个hive表,如下所示:

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

以上述格式读取和提取数据

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

读取字符串

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

它工作正常,图案清晰。