package sqlspark.Day04

import java.lang

import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}

object UdafText05 {
def main(args: Array[String]): Unit = {
//创建sparksession
val spark: SparkSession = SparkSession.builder().appName("ipdemo2").master("local[*]").getOrCreate()
//2.创建分布式的数据集合
val number: Dataset[lang.Long] = spark.range(1, 11) //转换为df
val numberDF: DataFrame = number.toDF()
//number.show()
//3.注册为视图
numberDF.createTempView("v_number")
//注册UDAF函数
spark.udf.register("geo",new GemMean05_1())
//sq
spark.sql("select geo(id) result from v_number").show()
spark.stop()
}
}
package sqlspark.Day04

import org.apache.spark.sql.Row
import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction}
import org.apache.spark.sql.types.{DataType, DataTypes, StructField, StructType} class GemMean05_1 extends UserDefinedAggregateFunction {
//运算输入数据的类型
override def inputSchema: StructType = StructType(List(
StructField("value", DataTypes.DoubleType) )) //产生中间结果的数据类型
override def bufferSchema: StructType = StructType(List(
StructField("product", DataTypes.DoubleType),
StructField("counts", DataTypes.LongType)
)) //最终结果的数据类型
override def dataType: DataType = DataTypes.DoubleType //数据一致性
override def deterministic: Boolean = true //分区运算的初始值
override def initialize(buffer: MutableAggregationBuffer): Unit = {
//buffer(0) 存放的分区预算数据数量的初始值
//buffer(0) = 0L
buffer(0) = 1.0
//buffer(1) 存放的是分区运算乘积的初始值
// buffer(1) = 1.0
buffer(1) = 0L
} //没计算一条数据,更新中间结果
override def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
//累加计算个数
// buffer(0) = buffer.getLong(0) + 1L
buffer(1) = buffer.getLong(1) + 1L
//累乘 数字
// buffer(1) =buffer.getDouble(0) * input.getDouble(0)
buffer(0) = buffer.getDouble(0) * input.getDouble(0) } //合并 将各个分区的计算结果累加和累乘
override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
buffer1(0) = buffer1.getDouble(0) * buffer2.getDouble(0)
buffer1(1) = buffer1.getLong(1) + buffer2.getLong(1)
} //最终计算
override def evaluate(buffer: Row): Any = {
math.pow(buffer.getDouble(0), 1.toDouble / buffer.getLong(1))
}
}

SparkSQL---UDAF的更多相关文章

  1. 搭建Spark所遇过的坑

    一.经验 1.Spark Streaming包含三种计算模式:nonstate .stateful .window 2.kafka可通过配置文件使用自带的zookeeper集群 3.Spark一切操作 ...

  2. 【Spark篇】---SparkSql之UDF函数和UDAF函数

    一.前述 SparkSql中自定义函数包括UDF和UDAF UDF:一进一出  UDAF:多进一出 (联想Sum函数) 二.UDF函数 UDF:用户自定义函数,user defined functio ...

  3. 【Spark篇】---SparkSQL中自定义UDF和UDAF,开窗函数的应用

    一.前述 SparkSQL中的UDF相当于是1进1出,UDAF相当于是多进一出,类似于聚合函数. 开窗函数一般分组取topn时常用. 二.UDF和UDAF函数 1.UDF函数 java代码: Spar ...

  4. SparkSQL之UDAF使用

    1.创建一个类继承UserDefinedAggregateFunction类. ------------------------------------------------------------ ...

  5. spark-sql自定义函数UDF和UDAF

    1 UDF对每个值进行处理: 2 UDAF对分组后的每个值处理(必须分组) SparkConf sparkConf = new SparkConf() .setMaster("local&q ...

  6. 【Spark-SQL学习之三】 UDF、UDAF、开窗函数

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  7. 048 SparkSQL自定义UDAF函数

    一:程序 1.需求 实现一个求平均值的UDAF. 这里保留Double格式化,在完成求平均值后与系统的AVG进行对比,观察正确性. 2.SparkSQLUDFDemo程序 package com.sc ...

  8. 45、sparkSQL UDF&UDAF

    一.UDF 1.UDF UDF:User Defined Function.用户自定义函数. 2.scala案例 package cn.spark.study.sql import org.apach ...

  9. Spark(十三)【SparkSQL自定义UDF/UDAF函数】

    目录 一.UDF(一进一出) 二.UDAF(多近一出) spark2.X 实现方式 案例 ①继承UserDefinedAggregateFunction,实现其中的方法 ②创建函数对象,注册函数,在s ...

  10. 【转】Spark-Sql版本升级对应的新特性汇总

    Spark-Sql版本升级对应的新特性汇总 SparkSQL的前身是Shark.由于Shark自身的不完善,2014年6月1日Reynold Xin宣布:停止对Shark的开发.SparkSQL抛弃原 ...

随机推荐

  1. 换到GitHub 博客了

    觉得还是github上面的代码风格看起来舒服些,所以决定把blog搬到github上面去了.以后这里就作为一个放资料的地方吧. github地址:http://l34rner.github.io/

  2. C++扬帆远航——16(猜数字)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:guessnum.cpp * 作者:常轩 * 微信公众号:Wor ...

  3. TCP 可靠传输与流量控制的实现

    TCP 可靠传输与流量控制的实现 一.TCP可靠传输的实现 现在所讲的可靠传输是根据之前所说的可靠传输原理的实现,是现实中应用的技术. 1.1.以字节为单位的滑动窗口 如图A端一份文件分为了多个字节, ...

  4. Nginx 配置GeoIP2 禁止访问,并允许添加白名单过滤访问设置

    配置环境:Centos 7.6 + Tengine 2.3.2 GeoIP2 下载地址:https://dev.maxmind.com/geoip/geoip2/geolite2/ 1. Nginx  ...

  5. Magisk了解以及简单的模块制作

    Magisk,就是刷机经常会需要使用的,也是就是我们说的面具或者脸谱.因为它的logo就是面具或者说脸谱.我们先简单了解一下: XDA上论坛的说明:Magisk - The Universal Sys ...

  6. win10 pycharm快捷键

    编辑: 1.复制(行) ctrl + D (光标与需要复制的代码同行) 2.删除(行) ctrl + Y(光标与需要删除的代码同行) 3.光标换行 Shift + Enter(不管光标在该行的哪个位置 ...

  7. iOS开发线程同步技术-锁

    概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...

  8. Java设计模式二

    今天谈的是工厂模式,该模式用于封装和对对象的创建,万物皆对象,那么万物又是产品类,如一个水果厂生产三种水果罐头,我们就可以将这三种水果作为产品类,再定义一个接口用来设定对水果罐头的生成方法,在工厂类中 ...

  9. LaTex公式符号

    下面这个网站是我认为比较齐全的网站 http://www.mohu.org/info/symbols/symbols.htm

  10. JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线

    5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...