pig脚本/命令,用于在多个字符串上过滤文件

gc0ot86w  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(444)

我正在尝试编写一个java程序或hadoop pig脚本,它将采用逗号分隔字符串的参数(例如。 , def, xyz )并筛选文件中包含一个或多个字符串的记录。
例如
输入文件:

1    abctree
2    pqrwewe
3    rtrxyz45
4    abcxyz
5    234rt23

输入参数为: , def, xyz 预期产量:

1    abctree
3    rtrxyz45
4    abcxyz

我能够编写脚本过滤1字符串的文件,使用 matches ,但不知道如何对多个字符串执行此操作。我需要为此编写自定义项吗?
我在这个问题中添加了java标记,因为根据我的初步发现,我将不得不编写一个用java编写的udf。所以,如果有人知道用java写这个的方法,请发布你的解决方案。

svujldwt

svujldwt1#

我不知道pig,但在java中,您可以使用以下内容:

String[] words = input.split("[\\s,]+");

String line;
while((line = file.readLine()) != null){
    for(String word : words){
        if(line.contains(word)){
            System.out.print(line);
            break;
        }
    }
}
``` `contains` 足以找到文字。你可以根据 `input` 在那上面串和匹配。这个表达式看起来像 `foo|bar|baz` ,但您需要转义元字符,以便它们在匹配过程中是文本的,这可以通过 `java.util.regex.Pattern.quote` .
bakd9h0s

bakd9h0s2#

我想出来了:

B = filter A by (n matches '.*string1.*' or n matches '.*string2.*' or n matches '.*string3.*');

这就成功了。
但是,根据我的要求,我将接受来自命令行的“逗号分隔”输入,例如。 string1, string2, string3 . 所以下一个任务是以某种方式分离单个字符串,并在上面的表达式中使用它们。如果有人知道怎么做(特别是没有自定义项),请张贴。

相关问题