给定 Hadoop 中的阈值,如何使用 PIG 进行连接

Posted

技术标签:

【中文标题】给定 Hadoop 中的阈值,如何使用 PIG 进行连接【英文标题】:How can I do joins given a threashold in Hadoop using PIG 【发布时间】:2013-11-26 18:35:15 【问题描述】:

假设我有一个具有以下架构的数据集:

ItemName (String) , Length (long)

我需要根据长度找到重复的项目。这在 PIG 中很容易做到:

raw_data = LOAD...dataset
grouped = GROUP raw_data by length
items = FOREACH grouped GENERATE COUNT(raw_data) as count, raw_data.name;
dups = FILTER items BY count > 1;
STORE dups....

上面找到了完全相同的重复项。给定下面的集合: 一,100 乙,105 c, 100

它会输出 2, (a,c)

现在我需要使用阈值查找重复项。例如,阈值 5 表示如果项目的长度为 +/- 5,则匹配项目。因此输出应如下所示:

3, (a,b,c)

有什么想法可以做到这一点吗?

这几乎就像我希望 PIG 在其 join 期间比较记录时使用 UDF 作为其 comparator...

【问题讨论】:

【参考方案1】:

我认为做你想做的唯一方法是将数据加载到两个表中,并对数据集进行笛卡尔连接,以便可以将每个值与其他值进行比较。

伪代码:

r1 = load dataset
r2 = load dataset
rcross = cross r1, r2

rcross 是一种笛卡尔积,可让您检查每对之间的长度差异。

【讨论】:

【参考方案2】:

我曾经解决过一个类似的问题,得到了一个疯狂而肮脏的解决方案。 它基于下一个引理:

If |a - b| < r then there exists such an integer number x: 0 <= x < r that
floor((a+x)/r) = floor((b+x)/r) 

(进一步我的意思是整数除法,将省略 floor() 函数,即 5/2=2)

这个引理很明显,我不会在这里证明它

根据这个引理,您可以进行下一次连接:

RESULT = JOIN A by A.len / r, B By B.len / r

并从与|A.len - B.len| 对应的所有 值中获取几个

但是这样做 r 次:

RESULT0 = JOIN A by A.len / r, B By (B.len / r)
RESULT1 = JOIN A by (A.len+1) / r, B By (B.len+1) / r
...
RESULTR-1 = JOIN A by (A.len+r-1) / r, B By (B.len+r-1) / r

您将获得所有需要的值。当然你会得到比你需要的更多的行,但正如我已经说过的那样,这是一个肮脏的解决方案(即它不是最佳的,但可以工作)

此解决方案的另一个大缺点是 JOIN 应该是动态编写的,并且它们的数量对于 big r 来说会很大。 如果您知道 r 并且它相当小(在您的情况下像 r=6),它仍然可以工作

希望对你有帮助

【讨论】:

以上是关于给定 Hadoop 中的阈值,如何使用 PIG 进行连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hadoop/PIG 中处理非 ASCII/亚洲/中文字符

如何查看Hadoop上安装的pig版本

在 hadoop 中的 Pig 中使用正则表达式

如何使用 apache pig 在 hadoop 集群上加载文件?

在 Pig 中使用 Python UDF 时,如何让 Hadoop 查找导入的 Python 模块?

如何在 Hadoop pig 中使用“case when”?