Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Apache Spark-多个RDD的交集_Scala_Apache Spark - Fatal编程技术网

Scala Apache Spark-多个RDD的交集

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.

在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.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之间的连接之前,一个好的做法是使用散列分区器来避免重复的重新排列,并使其更有效。在您的代码中,您不使用任何哈希分区。重新分区是按定义洗牌,并将默认值连接到集合中的最佳分区器。