[英]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.