UserDefinedUntypedAggregate.scala(默认返回类型为空,不能更改)


  1. import org.apache.spark.sql.{Row, SparkSession}
  2. import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction}
  3. import org.apache.spark.sql.types._
  4. object UserDefinedUntypedAggregate {
  5. // $example on: untyped_custom_aggregations$
  6. object MyAverage extends UserDefinedAggregateFunction {
  7. //Data types of input arguments of this aggregate function
  8. def inputSchema: StructType = StructType(StructField("inputColumn", LongType) :: Nil)
  9. //Data types of values in the aggregation buffer
  10. def bufferSchema: StructType = {
  11. StructType(StructField("sum", LongType) :: StructField("count", LongType) :: Nil)
  12. }
  13. //The data type of the returned value
  14. def dataType: DataType = DoubleType
  15. //Whether this function always return s the same output on the identical input
  16. def deterministic: Boolean = true
  17. // """
  18. // |Initializes the given aggregation buffer.
  19. // |The buffer itself is a `Row` that in addition to
  20. // |standard method like retrieving a value at an index (e.g., get(), getBoolean()),
  21. // |providesthe opportunity to update its values.
  22. // |Note that arrays andmaps inside the buffer are still ummutable.
  23. // """
  24. def initialize(buffer: MutableAggregationBuffer): Unit = {
  25. buffer(0) = 0L
  26. buffer(1) = 0L } //Updates the given aggregation buffer `buffer` with new input data from `input`
  27. def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
  28. //isNullAt() -> Checks whether the value at position i is null.
  29. if (!input.isNullAt(0)) {
  30. buffer(0) = buffer.getLong(0) + input.getLong(0)
  31. buffer(1) = buffer.getLong(1) + 1
  32. }
  33. }
  34. //Merges two aggregation buffers and stores the updated buffer values back to `buffer1`
  35. def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
  36. buffer1(1) = buffer1.getLong(0) + buffer2.getLong(0)
  37. buffer1(1) = buffer1.getLong(1) + buffer2.getLong(1)
  38. }
  39. // Calcuates the final result
  40. def evaluate(buffer: Row): Double = buffer.getLong(0).toDouble / buffer.getLong(1)
  41. }
  42. // $example off: untyped_custom_aggregation$
  43. def main(args: Array[String]): Unit = {
  44. val spark = SparkSession
  45. .builder()
  46. .master("local")
  47. .appName("Spark SQL user-defined DataFrames aggregation example")
  48. .getOrCreate()
  49. // $eeample on: untyped_custom_aggregation$
  50. //Register the function to access it
  51. spark.udf.register("myAverage", MyAverage)
  52. val df = spark.read.json("/Users/hadoop/app/spark/examples/src/main/resources/employees.json")
  53. df.createOrReplaceTempView("employees")
  54. df.show()
  55. val result = spark.sql("SELECT myAverage(salary) as average_salary FROM employees")
  56. result.show()
  57. spark.stop()
  58. }
  59. }

sparkSQL中的example学习(2)的更多相关文章

  1. sparkSQL中的example学习(1)

    SparkSQLDemo.scala import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.types ...

  2. sparkSQL中的example学习(3)

    UserDefinedTypedAggregation.scala(用户可自定义类型) import org.apache.spark.sql.expressions.Aggregator impor ...

  3. PHP中的Libevent学习

    wangbin@2012,1,3 目录 Libevent在php中的应用学习 1.      Libevent介绍 2.      为什么要学习libevent 3.      Php libeven ...

  4. JS中childNodes深入学习

    原文:JS中childNodes深入学习 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <ti ...

  5. CNCC2017中的深度学习与跨媒体智能

    CNCC2017中的深度学习与跨媒体智能 转载请注明作者:梦里茶 目录 机器学习与跨媒体智能 传统方法与深度学习 图像分割 小数据集下的深度学习 语音前沿技术 生成模型 基于贝叶斯的视觉信息编解码 珠 ...

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

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

  7. 图解BERT(NLP中的迁移学习)

    目录 一.例子:句子分类 二.模型架构 模型的输入 模型的输出 三.与卷积网络并行 四.嵌入表示的新时代 回顾一下词嵌入 ELMo: 语境的重要性 五.ULM-FiT:搞懂NLP中的迁移学习 六.Tr ...

  8. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  9. Scala中的类学习

    Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...

随机推荐

  1. Django 的admin

    admin使用 Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: # Application ...

  2. BayaiM__MySQL 常用函数

    BayaiM__MySQL 常用函数 原创 作者:bayaim 时间:2016-06-16 09:11:13 122 0删除编辑  MySQL 常用函数 阅读(883430) | 评论(44543) ...

  3. [Go] 利用有缓存channel控制同时并发的数量

    如果有一个大循环,里面每一个都开启groutine,那么瞬间就会开启非常多的groutine,要解决这个问题就要用channel的阻塞特性来解决 package main import "t ...

  4. WindowsServer2003中IIS支持php的配置

    1.安装MySQL(没有特殊说明的就按照默认安装)选择 Custom 自定义安装点击"Change"更改 MySQL 安装目录(自定义)其他按照默认的下一步就可以 安装完成后会自动 ...

  5. MD文件图片base64自动编码

    看工具链接请直接将文章拉到最后.. 概述 不知道你在使用markdown写文章的时候有没有遇到过这样的烦恼, 文件写完了, 想将写完的文章粘贴到博客的时候, 你满心欢喜的复制粘贴, 但是发现图片根本复 ...

  6. 初学JavaScript正则表达式(九)

    分组:可以用 ( ) 来进行分组 一.Byron重复三次             Byron{3} --------- Byronnn 只是将紧挨着量词的字符重复            (Byron) ...

  7. 小程序的flex布局

    小程序建议使用flex布局进行排版 flex就是一个盒装弹性布局 flex是一个容器,所有子元素都是他的成员 小程序的flex布局 定义布局 display:flex flex容器的属性: flex- ...

  8. Apache(基于IP地址)

    1.Apache的安装 (1)先用命令“cat /etc/passwd|grep apache”,查看有有没有Apache ①如果有Apache,我们就不用再安装 ②如果没有,我们就安装一下 (2)使 ...

  9. DOM的重绘和回流及代码性能优化

    1.DOM的重绘和回流Repaint&Reflow 1.1重绘:元素样式的改变(但宽高.大小.位置等不变) 如outline.visibility.color.background-color ...

  10. vue better-scroll

    better-scroll在vue项目中的使用 2017年12月21日 18:01:09 阅读数:411 1.准备工作 在项目中安装better-scroll: npm install --save ...