Pig脚本/命令用于过滤多个字符串上的文件

时间:2012-03-23 22:52:26

标签: java regex hadoop pattern-matching apache-pig

我正在尝试编写一个Java程序或Hadoop Pig脚本,它将采用逗号分隔字符串的参数(例如abc, def, xyz)并过滤包含一个或多个这些字符串的记录的文件。

E.g。

输入文件:

1    abctree
2    pqrwewe
3    rtrxyz45
4    abcxyz
5    234rt23

输入参数为:abc, def, xyz

预期产出:

1    abctree
3    rtrxyz45
4    abcxyz

我能够编写使用matches在1个字符串上过滤文件的脚本,但不知道如何为多个字符串执行此操作。我需要为此编写UDF吗?

我已将Java标记添加到此问题中,因为根据我的初步调查结果,我将编写一个将用Java编写的UDF。因此,如果有人知道用Java编写此方法,请发布您的解决方案。

2 个答案:

答案 0 :(得分:1)

我已经弄明白了:

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

这就是诀窍。

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

答案 1 :(得分:-1)

我不知道猪,但在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完成。