在hadoop中如何使用pig实现给定阈值的连接

6bc51xsx  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(279)

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

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 当它在运行期间比较记录时 join ...

56lgkhnf

56lgkhnf1#

我认为唯一的方法是将数据加载到两个表中,并对数据集本身进行笛卡尔连接,以便每个值可以相互比较。
伪代码:

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

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

w41d8nur

w41d8nur2#

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

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

您将获得所有需要的值。当然,您将得到比您需要的更多的行,但正如我已经说过的,这是一个肮脏的解决方案(即,它不是最佳的,但有效)
这种解决方案的另一个大缺点是连接应该是动态编写的,对于大r来说,它们的数量会很大。如果你知道r并且它很小(比如你的例子中的r=6),它仍然有效
希望有帮助

相关问题