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

Posted

技术标签:

【中文标题】用于过滤多个字符串上的文件的 Pig 脚本/命令【英文标题】:Pig script/command to filter a file on multiple strings 【发布时间】:2012-03-23 22:52:26 【问题描述】:

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

例如

输入文件:

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 编写此代码的方法,请发布您的解决方案。

【问题讨论】:

【参考方案1】:

我想通了:

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

这就是诀窍。

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

【讨论】:

【参考方案2】:

我不知道 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 完成。

【讨论】:

以上是关于用于过滤多个字符串上的文件的 Pig 脚本/命令的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中使用多个条件过滤列

Pig 多个存储命令创建重复工作

Pig Script 上的多个 AWS 账户

使用相同的 Pig 脚本存储多个文件

用于 PIG 捐赠错误的 Python UDF

Pig:更改输出文件 NAME 的格式