Scala Apache Spark-多个RDD的交集
在ApacheSpark中,可以使用Scala Apache Spark-多个RDD的交集,scala,apache-spark,Scala,Apache Spark,在ApacheSpark中,可以使用sparkContext.union()方法有效地合并多个RDD。如果有人想要将多个RDD相交,是否存在类似的情况?我在sparkContext方法中搜索过,但在其他任何地方都找不到。一种解决方案可能是联合RDD,然后检索重复的RDD,但我认为它没有那么有效。假设我有以下关于键/值对集合的示例: val rdd1 = sc.parallelize(Seq((1,1.0),(2,1.0))) val rdd2 = sc.parallelize(Seq((1,2.
sparkContext.union()
方法有效地合并多个RDD。如果有人想要将多个RDD相交,是否存在类似的情况?我在sparkContext方法中搜索过,但在其他任何地方都找不到。一种解决方案可能是联合RDD,然后检索重复的RDD,但我认为它没有那么有效。假设我有以下关于键/值对集合的示例:
val rdd1 = sc.parallelize(Seq((1,1.0),(2,1.0)))
val rdd2 = sc.parallelize(Seq((1,2.0),(3,4.0),(3,1.0)))
我要检索具有以下元素的新集合:
(1,2.0) (1,1.0)
当然,对于多个RDD,而不仅仅是两个RDD,请尝试:
val rdds = Seq(
sc.parallelize(Seq(1, 3, 5)),
sc.parallelize(Seq(3, 5)),
sc.parallelize(Seq(1, 3))
)
rdds.map(rdd => rdd.map(x => (x, None))).reduce((x, y) => x.join(y).keys.map(x => (x, None))).keys
尝试:
RDD上有一个,但只需要一个其他RDD:
def intersection(other: RDD[T]): RDD[T]
让我们用这个方法来实现您想要的方法
def intersectRDDs[T](rdds: Seq[RDD[T]]): RDD[T] = {
rdds.reduce { case (left, right) => left.intersection(right)
}
如果您已经了解了Spark连接的实现,那么可以通过将最大的RDD放在第一位来优化执行:
def intersectRDDs[T](rdds: Seq[RDD[T]]): RDD[T] = {
rdds.sortBy(rdd => -1 * rdd.partitions.length)
.reduce { case (left, right) => left.intersection(right)
}
编辑:看起来我误读了您的示例:您的文本看起来像是在搜索rdd.union的反向行为,但您的示例暗示您希望按键相交。我的回答没有解决这个问题。有一个关于RDD的问题,但它只需要一个其他RDD:
def intersection(other: RDD[T]): RDD[T]
让我们用这个方法来实现您想要的方法
def intersectRDDs[T](rdds: Seq[RDD[T]]): RDD[T] = {
rdds.reduce { case (left, right) => left.intersection(right)
}
如果您已经了解了Spark连接的实现,那么可以通过将最大的RDD放在第一位来优化执行:
def intersectRDDs[T](rdds: Seq[RDD[T]]): RDD[T] = {
rdds.sortBy(rdd => -1 * rdd.partitions.length)
.reduce { case (left, right) => left.intersection(right)
}
编辑:看起来我误读了您的示例:您的文本看起来像是在搜索rdd.union的反向行为,但您的示例暗示您希望按键相交。我的回答没有解决这个问题。为什么要将多个RDD相交?基于什么?我想现在我的问题更容易理解。你为什么要将多个RDD相交?基于什么?我想现在我的问题更容易理解。这很有效,谢谢。但是,如果每个集合都有键/值对,而不是整数,那么这将不起作用,对吗?此外,此方法使用联接。通常,散列分区器是一种很好的实践,对吗?只要元素可以散列,它就可以工作。除非你想要不同的输出。不理解第二个问题。在使用RDD之间的连接之前,一个好的做法是使用散列分区器来避免重复的重新排列,并使其更有效。在您的代码中,您不使用任何哈希分区。重新分区是按定义洗牌,并将默认值加入到集合中的最佳分区器。这很有效,谢谢。但是,如果每个集合都有键/值对,而不是整数,那么这将不起作用,对吗?此外,此方法使用联接。通常,散列分区器是一种很好的实践,对吗?只要元素可以散列,它就可以工作。除非你想要不同的输出。不理解第二个问题。在使用RDD之间的连接之前,一个好的做法是使用散列分区器来避免重复的重新排列,并使其更有效。在您的代码中,您不使用任何哈希分区。重新分区是按定义洗牌,并将默认值连接到集合中的最佳分区器。