簡體   English   中英

Apache Spark-多個RDD的交集

[英]Apache Spark - Intersection of Multiple RDDs

在Apache Spark中,可以使用sparkContext.union()方法有效地sparkContext.union()多個RDD。 如果有人要相交多個RDD,是否有類似的東西? 我已經搜索了sparkContext方法,但找不到任何東西。 一種解決方案是將rdds合並,然后檢索重復項,但我認為這樣做可能不那么有效。 假設我有以下關於鍵/值對集合的示例:

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)

但是,當然要有多個rdds,而不僅僅是兩個。

嘗試:

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的逆行為,但是您的示例暗示您希望通過鍵相交。 我的回答沒有解決這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM