Scala中的for循环遍历和yield详解

K-V对的RDD遍历

val hashpartitionCounts: RDD[(String, Int)] = kvpartitionRDD.reduceByKey((x, y) => x + y)

hashpartitionCounts.foreach{ line=>
  println("word="+line._1+" ,num="+line._2)
}
//下面的for和上面的一样结果
for (i <- hashpartitionCounts)
  print("word="+i._1+" ,num="+i._2)

对数组RDD的遍历

  //测试flatMap
    val wordPairRDD:RDD[String] = lineRDD.flatMap(line => {
      //将行转化为单词数组
      val words: Array[String] = line.split(" ")
      //单个单词数组 转化为相邻单词数组
      for (i <- 0 until words.length - 1) yield words(i) + "-" + words(i + 1)
    }
    )
    println("==========flatMap测试==========")
    wordPairRDD.foreach(println)

其中存在的yield详解下

       for循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合

       Scala中for循环是有返回值的。如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是List,以此类推

遍历1到5,对结果乘2,返回结果

scala> for (i <- 1 to 5) yield i * 2
res11: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6, 8, 10)

循环中的过滤

       for 循环, yield, 和守卫( guards) (for loop 'if' conditions)

       假如你熟悉了 Scala 复杂的语法, 你就会知道可以在 for 循环结构中加上 'if' 表达式. 它们作为测试用,通常被认为是一个守卫,你可以把它们与 yield 语法联合起来用。参见::

1 scala> val a = Array(1, 2, 3, 4, 5)
2 a: Array[Int] = Array(1, 2, 3, 4, 5)
3  
4 scala> for (e <- a if e > 2) yield e
5 res1: Array[Int] = Array(3, 4, 5)

Guess you like

Origin blog.csdn.net/someInNeed/article/details/121534054