2017-09-04 144 views
0

訪問變量中,我有以下RDD:斯卡拉 - 不能爲環

1:AAAAABAAAAABAAAAABAAAAAB 
2:BBAAAAAAAAAABBAAAAAAAAAA 

中的每個字符是一個事件。 Mi期望的輸出是獲得每組事件的發生次數。對於這第一個例子中,輸出應該是:

{ "A" -> 6 , "B" -> 6 } 

我的代碼,我得到所需的輸出:

val rdd = sqlContext.sparkContext.makeRDD(Seq(
"1:AAAAABAAAAABAAAAABAAAAAB","2:BBAAAAAAAAAABBAAAAAAAAAA")) 
val rddSplited = rdd.map(_.split(":")(1).toList) 
    val values = scala.collection.mutable.Map[String, Long]() 
    var iteracion = 0 
    for (ocurrences <- rddSplited) { 
     var previousVal = "0" 
     for (listValues <- ocurrences) { 
     if (listValues.toString != previousVal) { 
      values.get(listValues.toString) match { 
      case Some(e) => values.update(listValues.toString, e + 1) 
      case None => values.put(listValues.toString, 1) 
      } 
      previousVal = listValues.toString() 
     } 
     } 
     //println(values) //return the values 

    } 
     println(values) //returns an empty Map 

    } 

的問題是,

的println(值)

不返回任何數據,但如果在註釋println被放置時更改它,則地圖值確實會返回值。

如何在main for循環之後返回映射的最終值?

對不起,如果我的實現不是最好的,我是新的Scala/Spark世界。

在此先感謝。

我在編輯問題以更好地解釋我想實現的目標, 提供答案的代碼(感謝您的所有幫助)並未返回所需的輸出。我並不想對事件進行計數的數字,我需要的是計數的出現次數,當一個事件改變到另一個,即:

AAAAABAAAAABAAAAABAAAAAB => A-> 4 , B-> 4 
    BBAAAAAAAAAABBAAAAAAAAAA => A-> 2 , B-> 2 

So the final output should be A-> 6 , B-> 6 

我的誤解真的很抱歉。

+1

即使在一個不會被推薦(如突變/副作用)的JVM Scala代碼中,所以使用Spark ... – cchantep

回答

2

好像你正在嘗試以非常像Java的方式實現你的結果。我寫了一個斯卡拉功能風格的程序,不正是你想要的東西如下:

val rdd = sqlContext.sparkContext.makeRDD(Seq("1:AAAAABAAAAABAAAAABAAAAAB","2:BBAAAAAAAAAABBAAAAAAAAAA")) 

rdd.foreach{elem => 
    val splitted = elem.split(":") 
    val out: Seq[Map[Char, Int]] = splitted 
     .tail 
     .toSeq 
     .map(_.groupBy(c => c).map{case (key, values) => key -> values.length}) 
    println(out) 
    } 
+0

我已經爲問題添加了新的細節,試圖更好地解釋自己。 – AJDF

0

有你的代碼(相互狀態,慵懶的轉換)多種問題,試試這個:

val rdd = ss.sparkContext.makeRDD(Seq("1:AAAAABAAAAABAAAAABAAAAAB","2:BBAAAAAAAAAABBAAAAAAAAAA")) 

rdd.foreach{record => 
    val Array(_,events) = record.split(":") 
    val eventCount = events.groupBy(identity).mapValues(_.size) 
    println(eventCount) 
    } 

請注意,當您使用map而不是foreachmap爲懶惰)時,您將看不到println。另外,println轉到您的羣集的工作節點的標準輸出,如果您在spark中使用local模式,則只能看到它們。

+0

我已經爲問題添加了新的細節,試圖更好地解釋自己。 – AJDF