spark udaf 操作说明

/**
  *  udaf  计算每个评价流水的每个问卷的平均得分
  */
class CalScoreAvl extends UserDefinedAggregateFunction{

  //输入字段的个数和类型 index和score的名称不代表实际的字段 只是一个占位说明
  override def inputSchema: StructType = StructType(Array(StructField("index",StringType),StructField("score",DoubleType)))

  //中间存储的变量定义
  //这里定义三个
  // sum 用来存储总分
  // count 用来存储个数
  // parse 用来存储index的字符串 判断是否重复

  override def bufferSchema: StructType = StructType(Array(StructField("sum",DoubleType),StructField("count",IntegerType),StructField("parse",StringType)))

  //udaf最终的返回值
  override def dataType: DataType = DoubleType

  //默认true就OK
  override def deterministic: Boolean = true

  //初始化 上面定义的三个中间结构变量
  override def initialize(buffer: MutableAggregationBuffer): Unit = {
    buffer.update(0,0.0)
    buffer.update(1,0)
    buffer.update(2,"")
  }

  // 逻辑模块
  // 主要写三个变量通过什么方式去计算的逻辑
  // 这里是字段传入的index没有出现过 而且 score不是 0的话 sum 累加  count + 1  parse的index字符串拼接
  override def update(buffer: MutableAggregationBuffer, input: Row): Unit = {

    if (!buffer.getString(2).contains(input.getString(0)) && input.getDouble(1) != 0){
      buffer(0) = buffer.getDouble(0) + input.getDouble(1)
      buffer(1) = buffer.getInt(1) + 1
      buffer(2) = buffer.getString(2) + "_" + input.getString(0)
    }
  }

  //分布式合并规则
  override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
    buffer1(0) = buffer1.getDouble(0) + buffer2.getDouble(0)
    buffer1(1) = buffer1.getInt(1) + buffer2.getInt(1)
    buffer1(2) = buffer1.getString(2) +""+ buffer2.getString(2)
  }

  //最终输出的结果计算方式
  override def evaluate(buffer: Row): Any = {
    buffer.getDouble(0) / buffer.getInt(1)
  }
}
Spark中的UDAF是指用户自定义聚合函数(User-Defined Aggregate Function)。UDAF允许我们根据自己的业务需求定义一种聚合函数,以便在Spark中进行数据聚合操作UDAF有两个主要的使用方式: 1. 在DataFrame中使用UDAF:可以通过在DataFrame中注册UDAF函数来使用UDAF。首先从HDFS中加载数据到DataFrame中,然后注册UDAF函数,比如将所有名字变成大写的UDF函数,接下来创建临时视图,并执行注册的函数来进行数据聚合操作。 2. 在SparkSQL中使用UDAF:在SparkSQL中,虽然没有直接提供UDTF(User-Defined Table-Generating Function)函数,但可以使用flatMap来实现一对多的功能。而UDAF可以在学习Hive的时候使用,当内置函数无法满足业务处理需求时,可以考虑使用UDF函数来自定义处理。 综上所述,Spark中的UDAF允许用户根据自己的业务需求定义聚合函数,并在DataFrame或SparkSQL中使用,以实现数据的聚合操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【SparkSql篇02】SparkSql之自定义UDF和UDAF函数1](https://download.csdn.net/download/weixin_35738619/86336713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SparkSQL中自定义聚合(UDAF)函数](https://blog.csdn.net/onway_goahead/article/details/114808782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值