2017-02-27 66 views
0

我從spark開始,並且我還沒有理解一些概念。spark - 與鍵值比較

我有雙名像這樣的文件:

foo bar 
bar foo 

但foo和酒吧之間的相同關係。我試圖創建一個RDD只有一個關係

foo bar 

我創建這個代碼:

step1 = joined.reduceByKey(lambda x,y: x+';'+y).map(lambda x: (x[0], x[1].split(';'))).sortByKey(True).mapValues(lambda x: sorted(x)).collect() 

創建第一個輸出,和我想我需要另一個reduceByKey以刪除現有值以前的迭代,但我不知道如何做到這一點。

我是否正確思考?

+1

你的意思是在你的文件的記錄已被刪除,因爲它的價值已經存在,作爲一個關鍵第一個記錄? –

+0

@ rogue-one,是的。 –

回答

1

如何喜歡簡單的東西:

>>> sc.parallelize(("foo bar", "bar foo")).map(lambda x: " ".join(sorted(x.split(" ")))).distinct().collect() 
['bar foo'] 
+0

謝謝@santon!我創建了一個函數來解析你所建議的行。 #parse lines of file def parseLine(line): #sort link to avoid the problem n1,n2 =''.join(sorted(line.split('\ t'))。)split('') ) return(n1,n2) –

1
from pyspark.sql import functions as f  

rdd = spark.sparkContext.parallelize([('foo', 'bar'), ('bar', 'foo'), ]) 
df = spark.createDataFrame(rdd, schema=['c1', 'c2']) 
df = df.withColumn('c3', f.sort_array(f.array(df['c1'], df['c2']))) 
df.show() 

# output: 
+---+---+----------+ 
| c1| c2|  c3| 
+---+---+----------+ 
|foo|bar|[bar, foo]| 
|bar|foo|[bar, foo]| 
+---+---+----------+ 

使用數據幀是很容易

+0

謝謝@zhangtong。我喜歡你的建議。很高興看到其他方式來做同樣的事情。再次感謝! –