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