SparkSQL---UDAF(scala)

package com.spark.sparksql.udf

import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by root on 2017/08/11.
  */
object UDAF {

  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("UDAF").setMaster("local")
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)

    val names = Array("Xuruyun", "Wangfei", "Liangyongqi", "Xuruyun", "Xuruyun")
    val namesRDD = sc.parallelize(names, 4)
    val namesRowRDD = namesRDD.map(name=>Row(name))
    val structType = StructType(Array(StructField("name",StringType,true)))
    val namesDF = sqlContext.createDataFrame(namesRowRDD, structType)

    namesDF.registerTempTable("names")

    sqlContext.udf.register("strGroupCount", new StringGroupCount)

    sqlContext.sql("select name, strGroupCount(name) from names group by name")
        .collect().foreach(println)
  }
}
package com.spark.sparksql.udf

import org.apache.spark.sql.Row
import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types._

/**
  * Created by Administrator on 2017/08/11.
  */
class StringGroupCount extends UserDefinedAggregateFunction{
  override def bufferSchema: StructType = {
    StructType(Array(StructField("count",IntegerType,true)))
  }

  override def inputSchema: StructType = {
    StructType(Array(StructField("str",StringType,true)))
  }

  override def merge(buffer: MutableAggregationBuffer, buffer1: Row): Unit = {
    buffer(0) = buffer.getAs[Int](0) + buffer1.getAs[Int](0)
  }

  override def initialize(buffer: MutableAggregationBuffer): Unit = {
    buffer(0)=0
  }

  override def deterministic: Boolean = {
    true
  }

  override def evaluate(buffer: Row): Any = {
    buffer.getAs(0)
  }

  override def dataType: DataType = {
    IntegerType
  }

  override def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
    buffer(0)=buffer.getAs[Int](0)+1
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值