2011-12-11 86 views
0

我使用serde读取具有分隔符||的特定格式的数据,而像|||这样的可重复管道将永远不会出现在我的数据字符串中。我的数据正则表达式用于hive 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

回答

0

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

+0

此模式也可以正常工作。 :) – youlingman

+0

我很高兴你喜欢它:) – kol

0

看来我找到了使用regex look around的解决方案。

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

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

它工作正常,图案清晰读取的字符串。

相关问题