IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SparkSql 3.0 UDAF 求和,求平均 -> 正文阅读

[大数据]SparkSql 3.0 UDAF 求和,求平均

使用spark sql 3.0版本自定义UDFA ,

3.0版本之前 extends? UserDefinedAggregateFunction? 已经过时

新方法如下代码:

代码中自定义了求和,求平均

package com.cy.spark

import org.apache.log4j.{Level, Logger}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.expressions.{Aggregator, MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types.{DataType, IntegerType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Encoder, Encoders, Row, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}


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

    //屏蔽日志
    Logger.getLogger("org").setLevel(Level.ERROR)

    val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[4]")
    val sc = new SparkContext(conf)

    val spark = SparkSession.builder()
      .appName(this.getClass.getSimpleName)
      .master("local[4]")
      .getOrCreate()

    val rdd: RDD[String] = sc.textFile("E://file/spark/student01.txt")

    val stuRdd: RDD[Stu1] = rdd.map(line => {
      //class01 tom 100
      val split = line.split(" ")
      val classess = split(0)
      val name = split(1)
      val score = split(2).toInt
      Stu1(classess, name, score)
    })
    //重要
    import spark.implicits._
    //rdd -> df
    val df: DataFrame = stuRdd.toDF

    df.createOrReplaceTempView("stu")

    import org.apache.spark.sql.functions._

    //UDAF 求平均
    val avgAgg1 = new Aggregator[Double, (Double, Int), Double] {
      //初始值
      override def zero: (Double, Int) = (0.0, 0)
      //每个分组区局部聚合的方法,
      override def reduce(b: (Double, Int), a: Double): (Double, Int) = {
        (b._1 + a, b._2 + 1)
      }
      //全局聚合调用的方法
      override def merge(b1: (Double, Int), b2: (Double, Int)): (Double, Int) = {
        (b1._1 + b2._1, b1._2 + b2._2)
      }
      //计算最终的结果
      override def finish(reduction: (Double, Int)): Double = {
        reduction._1 / reduction._2
      }
      //中间结果的encoder
      override def bufferEncoder: Encoder[(Double, Int)] = {
        Encoders.tuple(Encoders.scalaDouble, Encoders.scalaInt);
      }
      //返回结果的encoder
      override def outputEncoder: Encoder[Double] = {
        Encoders.scalaDouble
      }
    }

    //UDAF 求和
    val sumAgg = new Aggregator[Int,Int,Int] {
      //初始值
      override def zero: Int = 0
      //每个分组区局部聚合的方法,
      override def reduce(b: Int, a: Int): Int = b + a
      //全局聚合调用的方法
      override def merge(b1: Int, b2: Int): Int = b1 + b2
      //计算最终的结果
      override def finish(reduction: Int): Int = reduction
      //中间结果的encoder
      override def bufferEncoder: Encoder[Int] = Encoders.scalaInt
      //返回结果的encoder
      override def outputEncoder: Encoder[Int] = Encoders.scalaInt
    }

    //自定义
    spark.udf.register("sum1", udaf(sumAgg))
    val sql =
      """
        |select classess, sum1(score) as score
        |from stu
        |group by classess
        |""".stripMargin

    spark.sql(sql).show()

    spark.stop()
  }
}

case class Stu1(classess:String, name:String, score:Int)

数据源:自己多造点

class01 tom 100

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-11 16:30:44  更:2022-05-11 16:31:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:08:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码