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_rdd
和res
的类型
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 的各个部分连接在一起效率更高
我想将以下 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_rdd
和res
的类型
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
.