如果使用PIG在Hadoop中给出阈值,我该如何进行连接

时间:2013-11-26 18:35:16

标签: hadoop mapreduce apache-pig bigdata

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

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....

以上找到了完全相同的内容。鉴于以下设定: a,100 b,105 c,100

输出2,(a,c)

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

3,(a,b,c)

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

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

2 个答案:

答案 0 :(得分:0)

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

的伪代码:

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

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

答案 1 :(得分:0)

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

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

所有值中获取几个值&LT; [R

但这样做 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
...
RESULT{R-1} = JOIN A by (A.len+r-1) / r, B By (B.len+r-1) / r

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

此解决方案的另一大缺点是JOIN应该动态编写,并且对于大 r ,它们的数量会很大。 如果你知道 r 仍然有效,而且它很小(例如你的情况下r = 6)

希望有所帮助