2016-08-23 8 views
-2

私のデータ=どのようにこの..sparkのScalaのコレクションのマップを作るために

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 :(リスト(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

関連する問題