在Spark中加入两个rdds,其中第一个rdd的值是第二个rdd的关键

时间:2017-10-16 08:10:35

标签: pyspark left-join rdd

有两个rdds,第一个是(key,value)对rdd_1

key1,[value1, value2]

第二个也是(键,值)对rdd_2

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

我希望加入rdd1rdd2以及rdd_1的{​​{1}}& value1value2中的key2。我想要的结果是

rdd2

我可以使用flatMap处理key1, [value1: value3, value2: value4] ,然后更改顺序,这意味着:

rdd1

然后加入key1,[value1, value2] -> (key1, value1),(key1, value2)->(value1, key1),(value2, key1) ,然后更改订单&与key1合并...... 这样做有效吗? THX。

1 个答案:

答案 0 :(得分: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]]|
+---+--------------+