栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 云计算 > 云平台

SparkCore算子之CombineByKey使用

云平台 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SparkCore算子之CombineByKey使用

SparkCore算子之CombineByKey使用

package com.bigdata.spark.core.rdd.oper.transform

import org.apache.spark.{SparkConf, SparkContext}

```scala
object RDD_Oper_Transform {

    def main(args: Array[String]): Unit = {
        val conf = new SparkConf().setMaster("local[*]").setAppName("Transform")
        val sc = new SparkContext(conf)
        val rdd = sc.makeRDD(
            List(
                ("a", 1), ("a", 2), ("b", 3),
                ("b", 4), ("b", 5), ("a", 6)
            ),
    2
        )
        // TODO 计算相同key的数据的平均值
        // 【 ("a", 1), ("a", 2), ("b", 3),】
        // 【 ("b", 4), ("b", 5), ("a", 6),】
        // (a, 3)(b, 4)
        // TODO reduceByKey算子更侧重于value的计算,不太关注数据的结构
        //rdd.reduceByKey
        // TODO aggregateByKey算子更侧重于分区内和分区间的计算逻辑不相同
        //rdd.aggregateByKey()
        // TODO foldByKey算子更侧重于分区内和分区间的计算逻辑相同
        //rdd.foldByKey()
        // TODO 转换数据结构
        // 【 ("a", 1), ("a", 2)】
        // 【 ("a", (1,1))), ("a", 2)】
        // 【 ("a", (3,2)), ("a", 6)】
        // 【 ("a", (9,3))】
//        rdd.map {
//            case ( word, cnt ) => {
//                (word, (cnt, 1))
//            }
//        }
//        .reduceByKey(
//            (t1, t2) => {
//                (t1._1 + t2._1, t1._2 + t2._2)
//            }
//        )
//        .collect().foreach(println)
        // TODO combineByKey算子可以传递三个参数
        //   1. 第一个参数表示第一个key的数据的转换处理
        //   2. 第二个参数表示分区内计算规则
        //   3. 第三个参数表示分区间计算规则

//        rdd.combineByKey(
//            v => (v, 1),
//            (t : (Int, Int), v) => {
//                (t._1 + v, t._2 + 1)
//            },
//            (t1:(Int, Int), t2:(Int, Int)) => {
//                (t1._1 + t2._1, t1._2 + t2._2)
//            }
//        ).collect().foreach(println)
        // TODO combineByKey算子可以实现 WordCount ( 6 / 10 )
        //combineByKey 算子的计算过程中,数据结果的类型是执行后确定的。
        // 所以需要明确设定数据的类型,不能省略。
        rdd.combineByKey(
            v => v,
            (t :Int, v) => {
                t + v
            },
            (t1:Int, t2:Int) => {
                t1 + t2
            }
        ).collect().foreach(println)
        sc.stop()
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/897620.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号