如何使用PIG在Hadoop中进行给定threashold的联接



假设我有一个具有以下模式的数据集:

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、 100b、 105c、 100

它将输出2,(a,c)

现在我需要使用阈值来查找重复项。例如,如果长度为+/-5,则阈值为5意味着匹配项目。所以输出应该看起来像:

3,(a,b,c)

你知道我该怎么做吗?

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

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

伪代码:

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

rcross是一个笛卡尔乘积,它允许您检查每对之间的长度差异。

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

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

但这样做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应该是动态编写的,并且它们的数量对于bigr来说会很大。如果你知道r并且它很小(在你的情况下,就像r=6),仍然有效

希望它能帮助

相关内容

  • 没有找到相关文章

最新更新