在Hadoop中,如何使用PIG实现给定threshold的连接

在Hadoop中,如何使用PIG实现给定threshold的连接,hadoop,mapreduce,apache-pig,bigdata,Hadoop,Mapreduce,Apache Pig,Bigdata,假设我有一个具有以下模式的数据集: ItemName (String) , Length (long) 我需要根据长度找到重复的项目。这在猪身上很容易做到: 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

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

ItemName (String) , Length (long)
我需要根据长度找到重复的项目。这在猪身上很容易做到:

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

它将输出2,(a,c)

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

3、(a、b、c)

你知道我该怎么做吗


这几乎就像我希望PIG在其
连接期间比较记录时使用UDF作为其
比较器

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

伪代码:

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) 
并从对应于| 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
您将获得所需的所有值。当然,您将获得比您需要的更多的行,但正如我已经说过的,这是一个肮脏的解决方案(即,它不是最优的,但有效)

此解决方案的另一个大缺点是连接应该动态写入,并且对于bigr,连接的数量将很大。 如果您知道r,并且它相当小(如您的例子中的r=6),它仍然有效

希望能有帮助

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