scala中scan()函数的用法例子
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了scala中scan()函数的用法例子相关的知识,希望对你有一定的参考价值。
参考技术A scan()括号内表示两个_ 做对应的值操作,这里加减乘除应该都可以,scan内的数字作为整个运算的第一个数,例如加法,那就是计算0,0+1,0+1+2,0+1+2+3,0+1+2+3+4,0+1+2+3+4+5,最后结果为0,1,3,6,10,15。其他运算同理。package com.example.scan
import org.apache.spark.SparkConf, SparkContext
object scanExample
def main(args: Array[String]):Unit =
val conf =new SparkConf().setAppName("wordcount")
val sc =new SparkContext(conf)
val numbers: Seq[Int] = Seq(1, 2, 3, 4, 5)
val runningTotal: Seq[Int] = numbers.scan(2)(_ + _)
sc.stop()
scala combineByKey用法说明
参考技术A语法是:
标记一下:(因为有很多同样的字母,方便说明我就按照字母+数字标记一下)
求他们各自的平均成绩
思路是: 通过combineByKey函数把按照人分组 求出 他们的总分 和科目数 ,然后用map函数 除一下就完事
操作1:为了模拟多个分区 我创建2个分区
说明:参照语法图
首先:各个分区的兄弟们先干活
第一个分区遍历开始 : 数据为
--> 处理(Fred,88), 因为是第一次遇到键“Fred”, 所以调用 createCombiner方法 (v)=> (v,1) ; 这里就是(88) => (88,1)
--> 处理(Fred,95),不是第一次遇到键“Fred”,调用 mergeValue方法 (acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((88,1),95)=>(88+95, 1+1)
--> 处理(Fred,91),不是第一次遇到键“Fred”,调用 mergeValue方法 (acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((88+95,1+1),91)=>(88+95+91, 1+1+1)
第一个分区遍历结束 :返回 (274,3) (注意一个分区中可能有很多不一样的键值对,我这里碰巧只有fred一个人 ,也许还有张三( , ), 李四( , ))(程序本来就按照键BYkeys分组了,所以不用担心混淆了键)
第二个分区遍历开始 : 数据为:
--> 处理(Wilma,93), 因为是第一次遇到键“Fred”, 所以调用 createCombiner方法 (v)=> (v,1) ; 这里就是(93) => (93,1)
--> 处理(Wilma,95),不是第一次遇到键“Fred”,调用 mergeValue方法 (acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((93,1),95)=>(93+95, 1+1)
--> 处理(Wilma,98),不是第一次遇到键“Fred”,调用 mergeValue方法 (acc:(Int,Int),v)=>(acc._1+v,acc._2+1),: 这里就是((93+95,1+1),98)=>(93+95+98, 1+1+1)
第一个分区遍历结束 :返回 (286,3)
然后:各个分区兄弟干完了 汇总处理
由于我的数据少,没有模拟到比如分区 1 和分区2 都有 Fred的成绩, 他三科成绩在第一个分区就全部统计到了。
假如 分区一返回的是fred信息(274,3),
分区二返回是 fred的体育成绩(80,1), 和wilma的三科成绩(286,3)
汇总后开始调用 mergeCombiners: (C, C) => C 方法
(acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)) 执行到就应该是 ((274,3),(80,1)) =>(274+80 , 3+1) (fred的结果)
。。。。。。。。。。。。=>(286,3) (WILMA的结果)
操作3: 把分数总和 和 科目数量除一下 得到平均成绩
以上是关于scala中scan()函数的用法例子的主要内容,如果未能解决你的问题,请参考以下文章