大数据IMF传奇行动绝密课程第72课:Spark SQL UDF和UDAF解密与实战
来源:互联网 发布:mac哪些好的软件下载 编辑:程序博客网 时间:2024/05/01 01:37
第72课:Spark SQL UDF和UDAF解密与实战
/** * scala代码 */package com.tom.spark.sqlimport org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction}import org.apache.spark.sql.types._import org.apache.spark.sql.{Row, SQLContext}import org.apache.spark.{SparkConf, SparkContext}/** * UDF:User Defined Function, 用户自定义的函数,函数的输入是一条具体的数据记录,实现上讲就是普通的scala函数; * UDAF:User Defined Aggregation Function, 用户自定义的聚合函数,函数本身作用于数据集合,能够在聚合操作的基础上进行自定义操作; * 实质上讲,例如说UDF会被Spark SQL中的catalyst封装成为expression,最终会通过eval方法来计算输入的输入Row,此处的Row和DataFrame * 中的Row没有任何关系 */object SparkSQLUDFUDAF { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[4]").setAppName("SparkSQLUDFUDAF") val sc = new SparkContext(conf) val sqlContext = new SQLContext(sc) //模拟实际使用的数据 val bigData = Array("Spark", "Spark", "Hadoop", "spark", "Hadoop", "spark", "Hadoop", "Hadoop", "spark", "spark") /** * 基于提供的数据创建DataFrame */ val bigDataRdd = sc.parallelize(bigData) val bigDataRDDRow = bigDataRdd.map(item => {Row(item)}) val structType = StructType(Array( new StructField("word", StringType, true) )) val bigDataDF = sqlContext.createDataFrame(bigDataRDDRow, structType) bigDataDF.registerTempTable("bigDataTable") //注册成为临时表 /** * 通过SQLContext注册UDF,在Scala 2.10.x版本UDF函数最多可以接收22个输入参数 */ sqlContext.udf.register("computeLength", (input: String) => input.length) //直接在sql中使用udf,就像使用SQL自带的内部函数一样 sqlContext.sql("select word, computeLength(word) as length from bigDataTable").show sqlContext.udf.register("wordcount", new MyUDAF) sqlContext.sql("select word, wordcount(word) as count,computeLength(word) as length " + "from bigDataTable group by word").show// while(true){} }}/** * 按照模板实现UDAF */class MyUDAF extends UserDefinedAggregateFunction { /** * 该方法指定具体输入数据的类型 * @return */ override def inputSchema: StructType = StructType(Array(StructField("input", StringType, true))) /** * 在进行聚合操作的时候所要处理的数据的结果的类型 * @return */ override def bufferSchema: StructType = StructType(Array(StructField("count", IntegerType, true))) /** * 指定UDAF函数计算后返回的结果类型 * @return */ override def dataType: DataType = IntegerType /** * 确保一致性,一般都用true * @return */ override def deterministic: Boolean = true /** * 在Aggregate之前每组数据的初始化结果 * @param buffer */ override def initialize(buffer: MutableAggregationBuffer): Unit = { buffer(0) = 0 } /** * 在进行聚合的时候,每当有新的值进来,对分组后的聚合如何进行计算 * 本地的聚合操作,相当于Hadoop MapReduce模型中的Combiner * @param buffer * @param input */ override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { buffer(0) = buffer.getAs[Int](0) + 1 } /** * 最后在分布式节点进行Local Reduce完成后需要进行全局级别的Merge操作 * @param buffer1 * @param buffer2 */ override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { buffer1(0) = buffer1.getAs[Int](0) + buffer2.getAs[Int](0) } /** * 返回UDAF最后的计算结果 * @param buffer * @return */ override def evaluate(buffer: Row): Any = buffer.getAs[Int](0)}
0 0
- 大数据IMF传奇行动绝密课程第72课:Spark SQL UDF和UDAF解密与实战
- 大数据IMF传奇行动绝密课程第61课:Spark SQL数据加载和保存内幕深度解密实战
- 大数据IMF传奇行动绝密课程第70课:Spark SQL内置函数解密与实战
- 大数据IMF传奇行动绝密课程第71课:Spark SQL窗口函数解密与实战
- 大数据IMF传奇行动绝密课程第67课:spark SQL案例综合实战
- 大数据IMF传奇行动绝密课程第69课:Spark SQL通过Hive数据源实战
- 大数据IMF传奇行动绝密课程第73课:Spark SQL Thrift Server实战
- 大数据IMF传奇行动绝密课程第27课:Spark on Yarn彻底解密
- 大数据IMF传奇行动绝密课程第13课:Spark内核架构解密
- 大数据IMF传奇行动绝密课程第14课:Spark RDD解密
- 大数据IMF传奇行动绝密课程第19课:Spark高级排序彻底解密
- 大数据IMF传奇行动绝密课程第33课:Spark Executor内幕彻底解密
- 大数据IMF传奇行动绝密课程第43课:Spark 1.6 Rpc内幕解密
- 大数据IMF传奇行动绝密课程第63课:Spark SQL下Parquet内幕深度解密
- 大数据IMF传奇行动绝密课程第32课:Spark Worker原理和源码剖析解密
- 大数据IMF传奇行动绝密课程第87课:Flume推送数据到Spark Streaming案例实战和内幕源码解密
- 大数据IMF传奇行动绝密课程第57课:Spark SQL on Hive配置及实战
- 大数据IMF传奇行动绝密课程第75-79课:Spark SQL基于网站Log的综合案例实战
- poj1915
- 向量几何在游戏编程中的使用1
- 小目标
- 使用Python将Excel中的数据导入到MySQL
- 叠筐
- 大数据IMF传奇行动绝密课程第72课:Spark SQL UDF和UDAF解密与实战
- 注意sonarQube与sonarRunner 的版本匹配(sonarquebe安装)
- Service知识点全解析(一)
- Leetcode #404 Sum of Left Leaves
- 向量几何在游戏编程中的使用2
- 算法复杂度
- 向量几何在游戏编程中的使用3
- JAVA面向对象,重写 重载的区别, 抽象类, 接口,final
- 熄灯问题