这是一种奇怪的情况,但我正在寻找一种方法来使用 MATCHES 之类的东西但在未知模式列表(未知长度)上进行过滤。
也就是说,如果给定的输入是两个文件,其中一个的编号为 A:
xxxx
年年
呜呜呜
Zyy
...等...
另一个是模式B:
xx.*
yyy.*
...等...
如何根据第二个输入中的所有模式过滤第一个输入?
如果我事先知道所有的模式,我可以 A = FILTER A BY (num MATCHES 'somepattern.*' OR num MATCHES 'someotherpattern'....);
问题是我事先不知道它们,并且由于它们是模式而不是简单的字符串,所以我不能只使用联接/组(至少据我所知)。 也许是一个奇怪的嵌套 FOREACH...东西? 有什么想法吗?
最佳答案
如果您使用作为OR
操作的|
,您可以从各个模式中构建一个模式。
(xx.*|yyy.*|zzzz.*)
这将检查它是否匹配任何模式。
编辑:
要创建组合的正则表达式模式:
* 创建一个以 (
开头的字符串
* 读入每一行(假设每一行都是一个模式)并将其附加到一个字符串后跟 |
* 完成读取行后,删除最后一个字符(这将是不需要的 |
)
* 追加 )
这将创建一个正则表达式模式来检查输入文件中的所有模式。 (注意:假定文件包含有效模式)
关于Hadoop/Pig 正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5706857/