2016-08-23 49 views
-2

我的數據=如何使這個..spark斯卡拉收集地圖

aaaa|1000 
bbb|1000 
ccc|1000 
aaaa|1000 
aaaa|2000 
aaaa|3000 
aaaa|2000 
aaaa|1000 
bbb|2000 
bbb|2000 
ccc|1000 
ccc|1000 
ccc|2000 
ccc|3000 
ccc|4000 

我要計數出現次數的數量每個數值,每個文本標籤:

aaaa||1000||3||2000||2||3000||1 
bbb||2000||2||1000||1 
ccc||1000||3||4000||1||2000||1||3000||1 

這是我的代碼

val UserShopRowData = inputData.map(s => (s.replace("|", " ").split(" "))).map(s => (s(0), s(1))) 
val u1 = UserShopRowData.map(s=> (s, 1)).reduceByKey(_+_) 
val u2 = u1.map(s => (s._1._1, s._1._2, s._2)) 
val u3 = u2.toLocalIterator.toList.sortBy(s => (s._1, s._3)).reverse 

,這是我得到的結果:

(ccc,1000,3) 
(ccc,4000,1) 
(ccc,2000,1) 
(ccc,3000,1) 
(bbb,2000,2) 
(bbb,1000,1) 
(aaaa,1000,3) 
(aaaa,2000,2) 
(aaaa,3000,1) 

請給我一個解決方案或建議。

+0

我不明白你的問題 – byxor

回答

0

看起來你幾乎在那裏 - 你只需要另一個groupBy和一些映射來獲得所需的結構。總共可以做到這一點如下:

// counting occurrences and reformatting into Tuple3's: 
val countByTuple: RDD[(String, String, Int)] = inputData.map(_.split('|').toList) 
    .map(s => (s, 1)) 
    .reduceByKey(_ + _) 
    .map { case (List(label, number), count) => (label, number, count) } 

// grouping by text label only, and reformatting into desired structure 
val result: RDD[(String, Iterable[(String, Int)])] = countByTuple.groupBy(_._1) 
    .map { case (key, iter) => (key, iter.map(t => (t._2, t._3))) } 

result.foreach(println) 
// prints: 
// (aaaa,List((1000,3), (2000,2), (3000,1))) 
// (bbb,List((2000,2), (1000,1))) 
// (ccc,List((1000,3), (4000,1), (3000,1), (2000,1))) 
+0

嗨〜謝謝你的回答。我在我的電腦中執行你的代碼示例。我得到的結果是「scala.MatchError:(List(ccc <, , , > 2000),1)(class scala.Tuple2)」。我現在調整代碼。 –

0
input 
.map(r=>r.split("\\|"))   // do basic word count on input data first 
.map(r=> ((r(0), r(1)),1))       
.reduceByKey(_ + _) 
.map(r=>(r._1._1,(r._1._2 + "||" + r._2))) // split key and aggregate again 
.reduceByKey((a,b)=> a+"||" + b) 
.map(r=>r._1 + "||" + r._2) 
+0

嗨〜非常感謝。我瞭解你的答案。 r.split(「\\ |」))我之前使用r.split(「|」),我希望值排序。我等待你的答案。祝你今天愉快。 –

+0

|是正則表達式中的元字符。你需要逃避它,請參考http://stackoverflow.com/questions/21524642/splitting-string-with-pipe-character – banjara