Scala 将 For 循环转换为函数式方法

Scala Convert For Loop to Functional Method

我想将以下 for 循环转换为函数式 Scala 方法。

for (i <- 15 to 25){
  count_table_rdd = count_table_rdd.union(training_data.map(line => (i+"_"+line(i)+"_"+line(0), 1)).reduceByKey(_ + _))
}

我试过查看 foreach 方法,但我不想转换每个项目,只是 15 到 25。

你可以弃牌。

val result = (count_table_rdd /: (15 to 25)){ (c, i) => c.union(...) }

如果您看到您有一组数据并且正在通过它推送一个值来更新该值,那么您应该折叠起来,因为这正是它的作用。

您也可以使用 tailrec,但您应该遵循 @rex 的方法。 它不会编译,相应地指定your count_table_rddres的类型

tailrec 版本:

@annotation.tailrec
  def f(start: Int = 15, end: Int = 25,res:List[Your_count_table_rdd_Type]=Nil): List[Your_count_table_rdd_Type] = {
    if (start > end) count_table_rdd
    else {
     val temp = res ++ training_data.map(line => (start + "_" + line(start) + "_" + line(0), 1)).reduceByKey(_ + _)
      f(start + 1, end,temp)
    }
  }

  f()

你也可以指定开始和结束。

f(30,45)

从 Spark 的角度来看,最好通过转换 trainingDataRDD 而不是循环到 select 给定的列。

类似于:

trainingData.flatMap(line => (15 to 25).map(i => (i+"_"+line(i)+"_"+line(0), 1)))
        .reduceByKey(_ + _)

这比使用 union.

将 RDD 的各个部分连接在一起效率更高