簡體   English   中英

Apache Spark:加入兩個具有不同分區器的 RDD

[英]Apache Spark: Join two RDDs with different partitioners

我有 2 個帶有不同分區器的 rdds。

case class Person(name: String, age: Int, school: String)
case class School(name: String, address: String)

rdd1Person的 RDD,我根據人的age進行了分區,然后將 key 轉換為school

val rdd1: RDD[Person] = rdd1.keyBy(person => (person.age, person))
                            .partitionBy(new HashPartitioner(10))
                            .mapPartitions(persons => 
                                 persons.map{case(age,person) => 
                                    (person.school, person)
                            })

rdd2是按School name分組的School的 RDD。

val rdd2: RDD[School] = rdd2.groupBy(_.name)

現在, rdd1是根據人的年齡進行分區的,所以所有相同年齡的人都進入相同的分區。 並且, rdd2根據學校名稱進行分區(默認情況下)。

我想rdd1.leftOuterJoin(rdd2)以這樣的方式rdd1不會被洗牌,因為與 rdd2 相比,rdd1 非常非常大。 另外,我將結果輸出到按age分區的 Cassandra,因此當前對rdd1分區將加快后面的寫入過程。

有沒有辦法在沒有以下情況下加入兩個 RDD:1. 混洗rdd1和 2. 廣播“rdd2”,因為rdd2大於可用內存。

注意:加入的 rdd 應該根據年齡進行分區。

假設您有兩個 rdds,rdd1 和 rdd2,並且想要應用連接操作。 並且如果 rdds 已分區(設置了分區)。 然后調用 rdd3 = rdd1.join(rdd2) 將使 rdd3 由 rdd1 分區。 rdd3 將始終從 rdd1 中獲取哈希分區(第一個父級,調用 join 的那個)。

暫無
暫無

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

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