我使用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
读取和提取上述格式的数据?
最佳答案
现在,您仅捕获由管道对分隔的组,但不包含管道字符本身:([^\\|]*)
。如果将其更改为 ((?:[^\\|]+\\|)*[^\\|]+)
那么每个组将能够在中间某处包含单个管道(如 a|bc
或 gg|g
),但不允许以管道开始或结束,因为这会导致歧义(例如:ab|||cd
可以分为 ab|
和 cd
或 ab
和 |cd
)。
关于java - hive serde 中多分隔符字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464995/