2014-11-21 46 views
0

我想從RDD每個地圖查看地圖值,MY quesn是如何使用scala檢查RDD中每個地圖上的地圖值?

Let examples:RDD[Map[Int,String]] 

即。

examples = 
Map(0 -> sunny, 1 -> hot, 2 -> high, 3 -> FALSE, 4 -> no) 
Map(0 -> sunny, 1 -> hot, 2 -> high, 3 -> TRUE, 4 -> no) 
Map(0 -> overcast, 1 -> hot, 2 -> high, 3 -> FALSE, 4 -> yes) 
Map(0 -> rainy, 1 -> mild, 2 -> high, 3 -> FALSE, 4 -> yes) 
Map(0 -> rainy, 1 -> cool, 2 -> normal, 3 -> FALSE, 4 -> yes) 

我想在最後一個鍵 - 值對每個Map.ie的,在這裏每個地圖的最後一個鍵 - 值對檢查「價值」是4 - >無,4 - >無,4 - >是的,.....從我需要檢查該鍵值對中的值,即。不,不,是,是,如果全部都是「不」,則返回「否」。

+0

有沒有「最後一個鍵 - 值對」地圖中的(除非您使用的是SortedMap的。你知道最大的指數將永遠是4? – 2014-11-21 10:14:29

+0

@保羅,我們可以從列數中找到最後一個索引 – rosy 2014-11-21 10:26:38

+0

奇怪,爲什麼不使用列表呢?如果您知道您有條目,則不需要映射0 ...地圖大小 - 1. – 2014-11-21 11:43:48

回答

0
val examples = List(
    Map(0 -> "sunny", 1 -> "hot", 2 -> "high", 3 -> "FALSE", 4 -> "no"), 
    Map(0 -> "sunny", 1 -> "hot", 2 -> "high", 3 -> "TRUE", 4 -> "no"), 
    Map(0 -> "overcast", 1 -> "hot", 2 -> "high", 3 -> "FALSE", 4 -> "yes"), 
    Map(0 -> "rainy", 1 -> "mild", 2 -> "high", 3 -> "FALSE", 4 -> "yes"), 
    Map(0 -> "rainy", 1 -> "cool", 2 -> "normal", 3 -> "FALSE", 4 -> "yes")) 

if (examples.forall(m => m(m.size - 1) == "yes")) 
    "yes" 
else 
    "no" 

但是這太可怕了。您對收藏的選擇是可疑的。如果您有一個Map,您知道0 .. <some-upper-bound>的密鑰沒有間隔,則表示有索引序列,而不是Map,如果使用IndexedSequence(例如ListVector),則會發現操作更容易。

適用於RDD的版本。關於收集的選擇意見仍然適用

val conf = new SparkConf().setAppName("spark-scratch").setMaster("local") 
val sc= new SparkContext(conf) 

val rdd = sc.parallelize(examples, 1) 

val yesno = rdd.map(m=>m(m.size - 1)) 
       .reduce ((l,r)=> if (l == "yes" && r == "yes") "yes" else "no") 
+0

我的val例子是RDD [Map [Int,String]]不是List [Map ...]]。所以在這裏我不能使用「forall」 – rosy 2014-11-25 05:30:56