Pig Latin 中不区分大小写的搜索

Posted

技术标签:

【中文标题】Pig Latin 中不区分大小写的搜索【英文标题】:Case-insensitive search in Pig Latin 【发布时间】:2015-02-24 22:25:29 【问题描述】:

这里是猪拉丁语初学者。 我正在尝试计算输入文件中多个字符串的出现次数。

现在搜索必须不区分大小写。我知道 pig 有一个 LOWER 内置函数,但是我该如何使用它呢?

例如(输入文件):

28-Oct-13,7:00PM,Viraj,New to hadoop ! Eager to learn.
31-Dec-14,3:00PM,‏Vanguard,Designers, Developers, Doers, don't miss this upcoming San Francisco Hadoop

我需要像hadoop, dec, learn, python 这样的字符串计数

hadoop 2
dec 1
learn 1
python 0

如何在 pig Latin 中进行此搜索?

谢谢。

【问题讨论】:

我已经为另一个人解决了类似的问题,但它看起来对他来说效果不佳,所以您可以尝试以下解决方案并让我知道这是否适合您?以下解决方案对我来说很好。 【参考方案1】:

你可以试试这个吗?

输入

28-Oct-13,7:00PM,Viraj,New to hadoop ! Eager to learn.
31-Dec-14,3:00PM,?Vanguard,Designers, Developers, Doers, don't miss this upcoming San Francisco Hadoop

PigScript:

A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE  FLATTEN(TOKENIZE(LOWER(line))) as word;
C = FOREACH B GENERATE ((word matches '.*hadoop.*'? 1:0)) as t1,((word matches '.*dec.*'?1:0)) as t2,((word matches '.*learn.*'?1:0)) as t3,((word matches '.*python.*'?1:0)) as t4;
D = GROUP C ALL;
E  = FOREACH D GENERATE FLATTEN(TOBAG(CONCAT('hadoop',' ',(chararray)SUM(C.t1)),CONCAT('dec',' ',(chararray)SUM(C.t2)),CONCAT('learn',' ',(chararray)SUM(C.t3)),CONCAT('python',' ',(chararray)SUM(C.t4))));
DUMP E;

输出:

(hadoop 2)
(dec 1)
(learn 1)
(python 0)

【讨论】:

以上工作正常。只是 CONCAT 函数接受了 2 个参数,所以不得不稍微改变一下。如果我们想搜索像“Hadoop”、“DEC”等这样的字符串呢?所以我们需要将它们转换为小写并做到这一点? 我已经在脚本 'LOWER(line)' 中将整个字符串转换为小写。您想要单独计算 hadoop 和 Hadoop 的总数吗? 没有。我的意思是我们也可以将搜索字符串转换为 LOWER 吗? 在这个脚本中你的搜索字符串应该是小写的,原因是我们在第2步(关系B)中将所有的字符串都转换为小写,所以你只需要使用小写进行搜索。在第 3 步(关系 C)中,您不能将搜索字符串转换为 lower,因为这是正则表达式匹配字符串 LOWER 函数不会。如果我没有回答你的问题,请给我一些例子 是的。您回答正确,但有没有其他方法可以将字符串转换为 LOWER 然后搜索?

以上是关于Pig Latin 中不区分大小写的搜索的主要内容,如果未能解决你的问题,请参考以下文章

Mongo中不区分大小写的搜索

Rails 模型中不区分大小写的搜索

如何在 Pig 中创建不区分大小写的匹配?

修改搜索以使其在 SQL Server 中不区分重音

VBA代码在MS Access中不区分大小写的过滤器

Oracle中不区分大小写的主键