我希望得到pyspark
中两个RDD的交集。它们如下所示:
rdd1 = sc.parallelize(["abc","def", "ghi"])
rdd2 = sc.parallelize([["abc","123"],["df",345], ["ghi","678"])
是否可以使用pyspark的rdd运算符来获取:
intersection_rdd --> ["abc","123"] ["ghi","678"]
答案 0 :(得分:2)
通过PySpark RDD的快速方法是使用join
,但请注意,它需要两个RDD大小相同。为此,我们将从下面的示例开始
rdd1 = sc.parallelize([["abc"],["def"], ["ghi"]])
rdd2 = sc.parallelize([["abc", 123],["df", 345], ["ghi", 678]])
然后,您可以创建rdd1a
,使其与rdd2
的大小相同。
rdd1a = rdd1.map(lambda x: (x[0], 1))
然后你可以运行join
:
rdd1a.join(rdd2).map(lambda x: (x[0], x[1][1])).collect()
## Out[25]: [('abc', 123), ('ghi', 678)]
请注意,这可能不是大型RDD的高效方法,但它是一种快速而快速的方法。
另一种方法是在下面使用DataFrames
:
df1 = rdd1.toDF(['col'])
df2 = rdd2.toDF(['col', 'value'])
df_intersect = df1.join(df2, df1.col == df2.col, 'inner').select(df1.col, df2.value)
df_intersect.show()
输出为:
+---+-----+
|col|value|
+---+-----+
|ghi| 678|
|abc| 123|
+---+-----+
答案 1 :(得分:1)
您将尝试这样来解决您的问题:
validation.js
输出:
rdd1 = sc.parallelize([[x] for x in ["abc","def", "ghi"]])
rdd2 = sc.parallelize([["abc","123"],["df",345], ["ghi","678"]])
df1 = rdd1.toDF(['key'])
df2 = rdd2.toDF(['key', 'value'])
intersect = df1.join(df2, 'key').orderBy('key')
intersect.show()