如何使用pyspark交叉两个rdd?

时间:2018-06-18 03:52:27

标签: apache-spark pyspark rdd intersection

我想将RDD与RDD文件相交。

我的文件由以下行组成:

a d e 112
b c d
a c e
a c d e 112
a e 112
a c d i
b c i 
a c d e 112
b c e
a d e i

例如代码:

from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName("intersection").setMaster("local[*]")

sc = SparkContext.getOrCreate()
finput = sc.textFile("data1.txt")

items = finput.flatMap(lambda x: x.split(" ")).map(lambda word: (word, 1))
itemsT = items.reduceByKey(lambda x, y: x+y)
sortItems = itemsT.sortBy(lambda x: x[1], False)
filterItems = sortItems.filter(lambda x: x[1] >=3)
frequetItems = filterItems.map(lambda x: x[0])

print("frequetItems: ", frequetItems.collect())
...
...

结果如下所示:

frequetItems:  ['c', 'a', 'e', 'd', '112', 'b', 'i']

但是,我想在frequentItems和逐行的data1.txt文件之间进行交叉,以获得如下所示的结果:

 a e d 112
 c d b 
 c a e
...
...
...

解决上述问题:

lines = finput.map(lambda x: x.split(" "))
intersect = lines.map(lambda x: list(set(x).intersection(frequentItems)))
tranSorte = intersect.map(lambda x: sorted(x, key=lambda y: frequentItems.index(y))).collect()

for line in tranSorte:
     print(line)

结果如下:

['a', 'e', 'd', '112']
['c', 'd', 'b']
['c', 'a', 'e']
['c', 'a', 'e', 'd', '112']
['a', 'e', '112']
['c', 'a', 'd', 'i']
['c', 'b', 'i']
['c', 'a', 'e', 'd', '112']
['c', 'e', 'b']
['a', 'e', 'd', 'i']

我认为这对每个人都有好处。 感谢。

0 个答案:

没有答案