groupBy()分组

groupBy算子

1)函数签名

def groupBy[K](f:T=>K)(implicit kt:ClassTag[K]):RDD[(K,Iterable[T])]

2)功能说明

分组,按照传入函数的返回值进行分组。将相同的key对应的值放入一个迭代器

3)需求说明:创建一个RDD,按照元素模以2的值进行分组。

4)具体实现:

package com.huc.Spark.value

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

object Test06_groupby {
  def main(args: Array[String]): Unit = {

    //1.创建SparkConf并设置App名称
    val conf: SparkConf = new SparkConf().setAppName("SparkCore").setMaster("local[*]")

    //2.创建SparkContext,该对象是提交Spark App的入口
    val sc: SparkContext = new SparkContext(conf)

    //3.使用Scala进行spark编程
    // 创建一个RDD
    val rdd: RDD[Int] = sc.makeRDD(1 to 4, 2)

    // 将每个分区的数据放到一个数组并收集到Driver端打印
    rdd.groupBy(i => i).collect().foreach(println)
    rdd.groupBy(_ % 2).collect().foreach(println)

    // 创建一个RDD
    val rdd1: RDD[String] = sc.makeRDD(List("hello", "hive", "hadoop", "spark", "scala"))

    // 按照首字母第一个单词相同的分组
    println("--------------")
    rdd1.groupBy(_.head).collect().foreach(println)
    rdd1.groupBy(str => str.substring(0, 1)).collect().foreach(println)

    // 4.关闭连接
    sc.stop()

  }
}

groupBy之WordCount

package com.huc.Spark1.value

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

object Test06_groupby {
  def main(args: Array[String]): Unit = {

    //1.创建SparkConf并设置App名称
    val conf: SparkConf = new SparkConf().setAppName("SparkCore").setMaster("local[*]")

    //2.创建SparkContext,该对象是提交Spark App的入口
    val sc: SparkContext = new SparkContext(conf)

    //3.使用Scala进行spark编程
    val add: RDD[String] = sc.textFile("input1/1.txt")

    val value: RDD[(String, Int)] = add.flatMap(_.split(" ").map((_, 1)))

    val value2: RDD[(String, Iterable[(String, Int)])] = value.groupBy(tuple => tuple._1)
    val value1: RDD[(String, Int)] = value2.map(tuple => (tuple._1, tuple._2.size))

    value1.collect().foreach(println)

    // 匿名函数模拟匹配的写法
    value2.map(tuple => tuple match {
      case (k, v) => (k, v.size)
    }).collect().foreach(println)

    // 偏函数的写法  能够省略外部的小括号,大括号不可以省略,因为大括号表示偏函数
    value2.map {
      case (k, v) => (k, v.size)
    }.collect().foreach(println)
    //4.关闭连接
    sc.stop()

  }
}

package com.huc.Spark.value

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

object Test07_groupby_wordcount {
  def main(args: Array[String]): Unit = {

    //1.创建SparkConf并设置App名称
    val conf: SparkConf = new SparkConf().setAppName("SparkCore").setMaster("local[*]")

    //2.创建SparkContext,该对象是提交Spark App的入口
    val sc: SparkContext = new SparkContext(conf)

    //3.使用Scala进行spark编程
    // 创建一个RDD
    val rdd: RDD[String] = sc.makeRDD(List("Hello Scala", "Hello Spark", "Hello World"))
    // 将字符串拆分成一个一个的单词  并进行转换:word=>(word,1)
    val value: RDD[(String, Int)] = rdd.flatMap((s: String) => s.split(" ").map((_, 1)))
    // 将转换后的数组分组
    val value1: RDD[(String, Iterable[(String, Int)])] = value.groupBy((tuple: (String, Int)) => tuple._1)
    // 将分组后的数据进行结构的转换
    val value2: RDD[(String, Int)] = value1.mapValues((list: Iterable[(String, Int)]) => {
      list.foldLeft(0)((res: Int, elem: (String, Int)) => res + elem._2)
    })
    value2.collect().foreach(println)
    println(value2.collect())
    println(value2.collect().mkString(","))

    //4.关闭连接
    sc.stop()

  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值