spark-sql自定义函数UDF和UDAF
1 UDF对每个值进行处理;
2 UDAF对分组后的每个值处理(必须分组)
SparkConf sparkConf = new SparkConf()
.setMaster("local")
.setAppName("MySqlTest"); JavaSparkContext javaSparkContext = new JavaSparkContext(sparkConf); SQLContext sqlContext = new SQLContext(javaSparkContext); List<String> list = new ArrayList<String>();
list.add("2018-9-9,1,ab");
list.add("2018-5-9,1124,abg");
list.add("2018-9-9,1125,abc");
list.add("2018-5-9,1126,abh");
list.add("2016-10-9,1127,abc");
list.add("2016-10-9,1127,abcd");
list.add("2016-10-9,1127,abcder"); JavaRDD<String> rdd_list = javaSparkContext.parallelize(list, 5); JavaRDD<Row> rdd_row_list = rdd_list.map(new Function<String, Row>() {
@Override
public Row call(String s) throws Exception {
return RowFactory.create(s.split(",")[0], Long.parseLong(s.split(",")[1]), s.split(",")[2]);//转换成一个row对象
}
}); List<StructField> structFieldList = new ArrayList<StructField>();
structFieldList.add(DataTypes.createStructField("date", DataTypes.StringType, true));
structFieldList.add(DataTypes.createStructField("s", DataTypes.LongType, true));
structFieldList.add(DataTypes.createStructField("str", DataTypes.StringType, true));
StructType dyType = DataTypes.createStructType(structFieldList); DataFrame df_dyType = sqlContext.createDataFrame(rdd_row_list, dyType); df_dyType.registerTempTable("tmp_req");
df_dyType.show(); //1,注册一个简单用户自定义函数
sqlContext.udf().register("zzq123", new UDF1<String, Integer>() {
@Override
public Integer call(String str) throws Exception {
return str.length();
}
}, DataTypes.IntegerType); DataFrame df_group = sqlContext.sql("select date,s,zzq123(date) as zzq123 from tmp_req ");//UDF如果没有指定名称,则随机名称
df_group.show(); //1,注册一个复杂的用户自定义聚合函数
sqlContext.udf().register("zzq_agg", new StringLen());//zzq_agg函数计算出分组后本组所有字符串总长度
DataFrame df_group_agg = sqlContext.sql("select date,zzq_agg(str) strSum from tmp_req group by date ");//UDAF为聚合情况下使用
df_group_agg.show();
UDAF实体:
public class StringLen extends UserDefinedAggregateFunction {
@Override
public StructType inputSchema() {//inputSchema指的是输入的数据类型
List<StructField> fields = new ArrayList<StructField>();
fields.add(DataTypes.createStructField("_string", DataTypes.StringType, true));
return DataTypes.createStructType(fields);
}
@Override
public StructType bufferSchema() {//bufferSchema指的是 中间进行聚合时 所处理的数据类型
List<StructField> fields = new ArrayList<StructField>();
fields.add(DataTypes.createStructField("_len", DataTypes.IntegerType, true));
return DataTypes.createStructType(fields);
}
@Override
public DataType dataType() {//dataType指的是函数返回值的类型
return DataTypes.IntegerType;
}
@Override
public boolean deterministic() {//一致性检验,如果为true,那么输入不变的情况下计算的结果也是不变的
return true;
}
/**
* 对于每个分组的数据进行最原始的初始化操作
*
* @param buffer
*/
@Override
public void initialize(MutableAggregationBuffer buffer) {
buffer.update(0, 0);//初始化的时候初始最开始的字符串的长度
}
/**
* 用输入数据input更新buffer值,类似于combineByKey
*
* @param buffer
* @param input
*/
@Override
public void update(MutableAggregationBuffer buffer, Row input) {//分组后的每个值处理方法
buffer.update(0, ((Integer) buffer.getAs(0)) + input.getAs(0).toString().length());//返回自己的长度
}
/**
* 合并两个buffer,将buffer2合并到buffer1.在合并两个分区聚合结果的时候会被用到,类似于reduceByKey
* 这里要注意该方法没有返回值,在实现的时候是把buffer2合并到buffer1中去,你需要实现这个合并细节
*
* @param buffer1
* @param buffer2
*/
@Override
public void merge(MutableAggregationBuffer buffer1, Row buffer2) {//相当于shuffle环节,将每组在不同executor上的数据进行combiner
buffer1.update(0, ((Integer) buffer1.getAs(0)) + ((Integer) buffer2.getAs(0)));//两次的字符串长度相加
}
/**
* 计算并返回最终的聚合结果
*
* @param buffer
* @return
*/
@Override
public Object evaluate(Row buffer) {
return buffer.getInt(0);
}
}
spark-sql自定义函数UDF和UDAF的更多相关文章
- 详解Spark sql用户自定义函数:UDF与UDAF
UDAF = USER DEFINED AGGREGATION FUNCTION Spark sql提供了丰富的内置函数供猿友们使用,辣为何还要用户自定义函数呢?实际的业务场景可能很复杂,内置函数ho ...
- hive自定义函数UDF UDTF UDAF
Hive 自定义函数 UDF UDTF UDAF 1.UDF:用户定义(普通)函数,只对单行数值产生作用: UDF只能实现一进一出的操作. 定义udf 计算两个数最小值 public class Mi ...
- Spark SQL 自定义函数类型
Spark SQL 自定义函数类型 一.spark读取数据 二.自定义函数结构 三.附上长长的各种pom 一.spark读取数据 前段时间一直在研究GeoMesa下的Spark JTS,Spark J ...
- Spark SQL 用户自定义函数UDF、用户自定义聚合函数UDAF 教程(Java踩坑教学版)
在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...
- 大数据学习day29-----spark09-------1. 练习: 统计店铺按月份的销售额和累计到该月的总销售额(SQL, DSL,RDD) 2. 分组topN的实现(row_number(), rank(), dense_rank()方法的区别)3. spark自定义函数-UDF
1. 练习 数据: (1)需求1:统计有过连续3天以上销售的店铺有哪些,并且计算出连续三天以上的销售额 第一步:将每天的金额求和(同一天可能会有多个订单) SELECT sid,dt,SUM(mone ...
- Spark(十三)SparkSQL的自定义函数UDF与开窗函数
一 自定义函数UDF 在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_ ...
- SparkSQL中的自定义函数UDF
在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响!
原文:T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst.语言版本影响! CSDN 的 Blog 太滥了!无时不刻地在坏! 开始抢救性搬家 ...
- 10_Hive自定义函数UDF
Hive官方的UDF手册地址是:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF 1.使用内置函数的快捷方法: 创 ...
随机推荐
- mycat 测试主从读写分离
下载解压及创建用户组和目录属性 下载地址:1.https://github.com/MyCATApache/Mycat-download.2.http://dl.mycat.io/ wget http ...
- oracle 11.2.0.4 rac 修改 ip vip scan ip
修改前host文件 198.27.73.21 ht-d01 198.27.73.22 ht-d02 198.27.73.25 ht-d01-vip 198.27.73.26 ht-d02-vip 19 ...
- Mysql --数据的增删改
插入数据 INSERT 更新数据 UPDATE 删除数据 DELETE 一. 在mysql管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 1.使用insert实现数据的插入 2.u ...
- 2018年发表论文阅读:Convolutional Simplex Projection Network for Weakly Supervised Semantic Segmentation
记笔记目的:刻意地.有意地整理其思路,综合对比,以求借鉴.他山之石,可以攻玉. <Convolutional Simplex Projection Network for Weakly Supe ...
- js判断是否在微信中打开
var ua = navigator.userAgent.toLowerCase(); if(ua.match(/MicroMessenger/i)=="micromessenger&quo ...
- linux 硬盘满了如何处理
事件源于在服务器运行一个脚本程序… 好好的脚本突然报错,还以为脚本出现问题了.细看报错原因(具体报错信息已经忘记了),是没有可用空间.从没遇见过这个情况,怎么办呢? 一.确定是不是真的是磁盘空间不足 ...
- eclipse下启动tomcat访问网址报404错误
问题: 解决步骤 首先检查一遍自己tomcat的相关配置,如果无误,则继续下面的操作 1.打开server视图,双击tomcat进入编辑页面 选择其中的第二个选项,并且修改Server path中的内 ...
- C#中抽象类和接口的区别(二)
一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外 ...
- es6中的...三个点
...是es6中新添加的操作符,可以称为spread或rest 定义一个数组 let name=['小红','小明','小白']; 我们在控制台输出 console.log(name); 结果: ...
- zepto.js移动端城市选择插件
http://sc.chinaz.com/jiaoben/170327301850.htm