繁体   English   中英

如何在Spark中使用MapReduce查找集合中的所有两对集合和元素?

[英]How to find all two pairs of sets and elements in a collection using MapReduce in Spark?

我有一组集合,每个集合包含许多项目。 我想使用Spark检索所有对集合和元素,其中经过归约处理后的每一对将包含两个项目和两个集合,例如:

如果我有这个套装清单

Set A={1,2,3,4 }
Set B={1,2,4,5}
Set C= {2,3,5,6}

映射过程将是:

(A,1)
(A,2)
(A,3)
(B,1)
(B,2)
(B,4)
(B,5)
(C,2)
(C,3)
(C,5)
(C,6)

减少后的目标结果是:

(A B, 1 2) // since 1 2 exist in both A and B
(A B, 1 4)
(A B, 2 4)
(A C,2 3)
(B C,2 5) 
here (A B,1 3) not in the result because 1 3 not exists in B

您能帮我在一张地图中解决Spark中的这一问题,并在任何一种语言(Python,Scala或Java)中简化函数的功能吗?

让我们将这个问题分为多个部分,我认为从输入列表到映射输出的转换是微不足道的。 所以让我们从那里开始

您有一个(String,int)列表,看起来像

("A", 1)
("A", 2)
....

让我们忘记首先需要在结果集中包含2个整数元素,然后让我们求解从映射输出中获取任意2个键之间的交集。

您输入的结果看起来像

(AB, Set(1,2,4))
(BC, Set(2,5))
(AC, Set(2,3))

为此,首先,从映射输出(mappedOutput)中提取所有键,该输出是(String,Int)的RDD,转换为set,并获得2个元素的所有组合(我在这里使用愚蠢的方法,这是一种好方法为此,比例尺将使用组合生成器)

val combinations = mappedOutput.map(x => x._1).collect.toSet
.subsets.filter(x => x.size == 2).toList
.map(x => x.mkString(""))

输出将是List(ab,ac,bc),这些组合代码将用作要结合的键。

将映射的输出转换为设置键(a,b,c)的列表=>元素集

val step1 = mappedOutput.groupByKey().map(x => (x._1, x._2.toSet)) 

将组合代码作为步骤1的关键

val step2 = step1.map(x => combinations.filter(y => y.contains(x._1)).map(y => (y, x))).flatMap(x => x)

输出将是(ab,(a,a中的一组元素)),(ac,(a,a中的一组元素))等。由于使用了过滤器,我们将不附加组合代码bc来设置a。

现在使用reduce获得我想要的结果

val result = step2.reduceByKey((a, b) => ("", a.intersect(b))).map(x => (x._1, x._2._2))

因此,我们现在就开始有了我提到的输出。 剩下的就是将结果转换为您需要的结果,这很容易做到。

val transformed = result.map(x => x._2.subsets.filter(x => x.size == 2).map(y => (x._1, y.mkString(" ")))).flatMap(x => x)

结束 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM