Pyspark十字路口

时间:2016-12-19 16:14:57

标签: apache-spark pyspark

我希望得到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"]

2 个答案:

答案 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()