2017-10-16 217 views
0

有兩種RDDS,第一個是一個(鍵,值)對rdd_1加入2個RDDS在火花其中第一RDD的值是第二RDD的鍵

key1,[value1, value2] 

第二個也是(鍵,值)對rdd_2

(key2, value3), (key3, value4)... 

我想加盟rdd1rdd2rdd_1value1 & value2爲的。我需要的結果是

key1, [value1: value3, value2: value4] 

我可以處理rdd1與flatMap,然後更改順序,這意味着:

key1,[value1, value2] -> (key1, value1),(key1, value2)->(value1, key1),(value2, key1) 

然後加入rdd2,然後更改訂單&合併與KEY1。 .. 有沒有更高效的做到這一點?謝謝。

回答

0

爲什麼不使用數據幀,比rdd快得多。 有了數據框,你可以做這樣的事情

from pyspark.sql import functions as f 
x = [(0, [1,2]),(1,[7,8])] 
y = [(1,4),(2,6),(8,4), (7,3)] 

x = spark.createDataFrame(sc.parallelize(x)).toDF("id", "vals") 
y = spark.createDataFrame(sc.parallelize(y)).toDF("id2", "val") 

(x.join(y, f.expr("array_contains(vals, id2)")).select("id", 
                 f.struct(["id2", "val"]).alias("map")). 
                 groupBy("id").agg(f.collect_list("map").alias("map"))).show() 



+---+--------------+ 
| id|   map| 
+---+--------------+ 
| 0|[[1,4], [2,6]]| 
| 1|[[8,4], [7,3]]| 
+---+--------------+