Hadoop Pig:提取所有匹配给定正则表达式的子字符串

3

我正在解析一些形式的数据:

(['L123', 'L234', 'L1', 'L253764'])
(['L23', 'L2'])
(['L5'])
...

括号内的短语,包括方括号,都被编码为单个字符数组。

我想提取L+(数字)标签以获取以下形式的元组:

((L123, L234, L1, L253764))
((L23, L2))
((L5))

我曾尝试使用正则表达式'(L\d+)'的REGEX_EXTRACT_ALL,但它似乎只能从每行中提取一个标签,这对我来说毫无用处。有没有办法按照我上面描述的方式创建元组?


这实际上是正确的,如果您使用FIND_ALL/EXTRACT_ALL定义,它应该可以工作。 - snf
我找不到FIND_ALL的任何文档,但它听起来像是我正在寻找的东西。你能指点我正确的方向吗?非常感谢。 - johnothegrouch
1个回答

2
如果顺序不重要,那么这个就可以起作用:

-- foo is the tuple, and bar is the name of the chararray
B = FOREACH A GENERATE TOKENIZE(foo.bar, ',') AS values: {T: (value: chararray)} ; 
C = FOREACH B {
    clean_values = FOREACH values GENERATE  
                   REGEX_EXTRACT(value, '(L[0-9]+)', 1) AS clean_value: chararray ; 
    GENERATE clean_values ;
} 

模式和输出如下所示:
C: {clean_values: {T: (clean_value: chararray)}}
({(L123),(L234),(L1),(L253764)})
({(L23),(L2)})
({(L5)})

通常来说,如果您不知道数组将有多少元素,那么使用“bag”会更好。


我对Pig不熟悉。你能解释一下bag内部的T:是什么吗? - johnothegrouch
袋子是无序元组集合。在这种情况下,clean_values 包含 n 个名为 T 的元组,其中 T 只包含 clean_value,一个字符串。 - mr2ert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接