有两个rdds,第一个是(key,value)对rdd_1
:
key1,[value1, value2]
第二个也是(键,值)对rdd_2
:
(key2, value3), (key3, value4)...
我希望加入rdd1
和rdd2
以及rdd_1
的{{1}}& value1
是value2
中的key2
。我想要的结果是
rdd2
我可以使用flatMap处理key1, [value1: value3, value2: value4]
,然后更改顺序,这意味着:
rdd1
然后加入key1,[value1, value2] -> (key1, value1),(key1, value2)->(value1, key1),(value2, key1)
,然后更改订单&与key1合并......
这样做有效吗? THX。
答案 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]]|
+---+--------------+