2016-10-13 71 views
2

我正在使用Spark 2.0來分析數據集。一列包含這樣的字符串數據:從Spark 2.0中的逗號分隔字符串中獲取不同的項目

A,C 
A,B 
A 
B 
B,C 

我希望得到一個JavaRDD與出現在列所有不同的項目,這樣的事情:

A 
B 
C 

這怎麼可能有效地火花完成?我在Java中使用Spark,但Scala示例或指針會很有用。

編輯: 我試過使用flatMap,但是我的實現非常慢。

JavaRDD<String> d = dataset.flatMap(s -> Arrays.asList(s.split(",")).iterator()) 

回答

1

嘗試使用:

1)爆炸:https://spark.apache.org/docs/2.0.0/api/java/ org.apache.spark.sql.functions.explode(塔COL)

static Column explode(Column e) 

爆炸 - 會爲每個新行給定數組或地圖列中的元素。

2)然後,執行在該列 「不同的」:

http://spark.apache.org/docs/latest/programming-guide.html

不同([numTasks]))返回包含源數據集的不同元件的新的數據集。

摘要

爆炸將導致每行一個項目(在本特定的列)。

鮮明只會留下明顯的項目

2

我不知道你所說的「慢」的意思。據推測,你有一個非常大的數據集(否則你不需要Spark),所以「慢」是相對的。不過,我只是做

dataset.flatMap(s -> s.split(",")).distinct 
-1

我知道冗長,但請嘗試這個,如果你想執行完成在執行器節點而不是工人完成。

dataset 
.flatMap(x => x.split(",")) 
.map(x => (x,1)) 
.sortByKey() 
.reduceByKey(_+_) 
.map(x=>x._1) 

如果你得到錯誤的數據格式補充一點:

dataset.map(x=>(x._1+","+x._2+","+x._3)) 

好奇,想知道你的發現。

相關問題