UserDefinedTypedAggregation.scala(用户可自定义类型)


  1. import org.apache.spark.sql.expressions.Aggregator
  2. import org.apache.spark.sql.{Encoder, Encoders, SparkSession}
  3. object UserDefinedTypedAggregation {
  4. case class Employee(name: String, salary: Long)
  5. case class Average(var sum: Long, var count: Long)
  6. object MyAverage extends Aggregator[Employee, Average, Double] {
  7. //A zero value for this aggregation. Should satisfy the property that any b + zero = b
  8. def zero: Average = Average(0L, 0L)
  9. //Commine two values to produce a new value. For performance, the function may modify `buffer`
  10. //and return it instead of constructiong a new object
  11. def reduce(buffer: Average, employee: Employee): Average = {
  12. buffer.sum += employee.salary
  13. buffer.count += 1
  14. buffer
  15. }
  16. //Merge two intermediate values
  17. def merge(b1: Average, b2: Average): Average = {
  18. b1.sum += b2.sum
  19. b1.count += b2.count
  20. b1
  21. }
  22. //Transform the ouput of the reduction
  23. def finish(reducetion: Average): Double = reducetion.sum.toDouble / reducetion.count
  24. //Specifies the Encoder for the intermediate value type
  25. def bufferEncoder: Encoder[Average] = Encoders.product
  26. //Specifies the Encoder for the final output value type
  27. def outputEncoder: Encoder[Double] = Encoders.scalaDouble
  28. }
  29. // $example off: type_custom_aggregation$
  30. def main(args: Array[String]): Unit = {
  31. val spark = SparkSession
  32. .builder()
  33. .appName("Spark SQL user-defined Datasets aggregation example")
  34. .master("local")
  35. .getOrCreate()
  36. import spark.implicits._
  37. val ds = spark.read.json("/Users/hadoop/app/spark/examples/src/main/resources/employees.json").as[Employee]
  38. ds.show()
  39. val averageSalary = MyAverage.toColumn.name("average_salary")
  40. val result = ds.select(averageSalary)
  41. result.show()
  42. spark.stop()
  43. }
  44. }

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

  1. sparkSQL中的example学习(1)

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

  2. sparkSQL中的example学习(2)

    UserDefinedUntypedAggregate.scala(默认返回类型为空,不能更改) import org.apache.spark.sql.{Row, SparkSession} imp ...

  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. bay——安装_RAC11g_LC_ASM方式_测试环境.txt

    ★★★____★☆★〓〓〓〓→VMware vSphere Client6.0 https://10.20.4.200/ 下载Vwmare IP:10.20.4.200-------账号:root-- ...

  2. RDPGuard6.1.7之后的问题

    RDPGuard是一款保护远程桌面RDP端口不被暴力猜解的软件,说下在使用RDP Guard中遇到的一些问题: 1.似乎D版RDPGuard 6.1.7或之后的版本,启用IP Cloud会自动将大量I ...

  3. HttpContext.Current.Server.MapPath("") 未将对象设置到引用的

    在多线程中使用该方法获取目录报错:未将对象设置到引用 #region 上传图片到腾讯 public async Task<Result> UploadImageToWX(string ba ...

  4. python的gRPC示例

    参考URL: https://segmentfault.com/a/1190000015220713?utm_source=channel-hottest gRPC 是一个高性能.开源和通用的 RPC ...

  5. OpenTelemetry项目中的Observability

    最近,在实操zipkin,jaeger,opencensus,opentracing,opentelemetry等. opentelemetry将Observability提到了重要页面, 并进行了讲 ...

  6. Overload 重载

  7. js支持装饰器

    vscode中使用装饰器不报错 { "compilerOptions": { "experimentalDecorators": true } } yarn a ...

  8. bcftools

    beftools非常复杂,大概有20个命令,每个命令下面还有N多个参数 annotate .. edit VCF files, add or remove annotations call .. SN ...

  9. Codeforces Round 589 (Div. 2) 题解

    Is that a kind of fetishism? No, he is objectively a god. 见识了一把 Mcdic 究竟出题有多神. (虽然感觉还是吹过头了) 开了场 Virt ...

  10. 删除cookie的封装

    remove cookie(key,options){ options=options||{}; options.expires=-1; 删除cookie,其实就是修改cookie,将之前设置好的co ...