我使用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
?
答案 0 :(得分:0)
现在,您只捕获由管道对分隔的组,但不包含自己的管道字符:([^\\|]*)
。如果您将其更改为((?:[^\\|]+\\|)*[^\\|]+)
,则每个组都可以在中间的某个位置包含单个管道(例如a|bc
或gg|g
),但不允许开始或结束管道,因为这会导致歧义(例如:ab|||cd
可以分为ab|
和cd
或ab
和|cd
)。
答案 1 :(得分:0)
我似乎找到了使用regex look around的解决方案。
对于像"a|b|c||d|e|f||g|h|i"
这样的数据,我可以用
"input.regex" = "(.*)(?=\\|\\|)\\|{2}(.*)(?=\\|\\|)\\|{2}(.*)"
它工作正常,图案清晰。