SparkSQL创建RDD:UDF & UDAF【文字说明+关键代码】

本文介绍了SparkSQL中的两种用户自定义函数类型:UDF(用户自定义函数)和UDAF(用户自定义聚合函数),详细阐述了它们的概念和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UDF:用户自定义函数,user defined function

UDF:用户自定义函数,user defined function
			可以自定义类实现UDFX接口,传几个参数,对应实现UDFX
			sqlContext.udf().register("StrLen", new UDF1<String,Integer>() {

				private static final long serialVersionUID = 1L;

				@Override
				public Integer call(String t1) throws Exception {
					return t1.length();
				}
			}, DataTypes.IntegerType);
			sqlContext.sql("select name ,StrLen(name) as length from user").show();

    UDAF:用户自定义聚合函数,user defined aggreagatefunction

	UDAF:用户自定义聚合函数,user defined aggreagatefunction
			sqlContext.udf().register("StringCount",new UserDefinedAggregateFunction() {
			
				/**
				 * 
				 */
				private static final long serialVersionUID = 1L;
				
				/**
				 * 初始化一个内部的自己定义的值,在Aggregate之前每组数据的初始化结果
				 */
				@Override
				public void initialize(MutableAggregationBuffer buffer) {
					buffer.update(0, 0);
				}
				
				/**
				 * 更新 可以认为一个一个地将组内的字段值传递进来 实现拼接的逻辑
				 * buffer.getInt(0)获取的是上一次聚合后的值
				 * 相当于map端的combiner,combiner就是对每一个map task的处理结果进行一次小聚合 
				 * 大聚和发生在reduce端.
				 * 这里即是:在进行聚合的时候,每当有新的值进来,对分组后的聚合如何进行计算
				 */
				@Override
				public void update(MutableAggregationBuffer buffer, Row arg1) {
					buffer.update(0, buffer.getInt(0)+1);
					
				}
				/**
				 * 合并 update操作,可能是针对一个分组内的部分数据,在某个节点上发生的 但是可能一个分组内的数据,会分布在多个节点上处理
				 * 此时就要用merge操作,将各个节点上分布式拼接好的串,合并起来
				 * buffer1.getInt(0) : 大聚合的时候 上一次聚合后的值       
				 * buffer2.getInt(0) : 这次计算传入进来的update的结果
				 * 这里即是:最后在分布式节点完成后需要进行全局级别的Merge操作
				 */
				@Override
				public void merge(MutableAggregationBuffer buffer1, Row buffer2) {
					buffer1.update(0, buffer1.getInt(0) + buffer2.getInt(0));
				}
				/**
				 * 在进行聚合操作的时候所要处理的数据的结果的类型
				 */
				@Override
				public StructType bufferSchema() {
					return DataTypes.createStructType(Arrays.asList(DataTypes.createStructField("bffer", DataTypes.IntegerType, true)));
				}
				/**
				 * 最后返回一个和dataType方法的类型要一致的类型,返回UDAF最后的计算结果
				 */
				@Override
				public Object evaluate(Row row) {
					return row.getInt(0);
				}
				/**
				 * 指定UDAF函数计算后返回的结果类型
				 */
				@Override
				public DataType dataType() {
					return DataTypes.IntegerType;
				}
				/**
				 * 指定输入字段的字段及类型
				 */
				@Override
				public StructType inputSchema() {
					return DataTypes.createStructType(Arrays.asList(DataTypes.createStructField("name", DataTypes.StringType, true)));
				}
				/**
				 * 确保一致性 一般用true,用以标记针对给定的一组输入,UDAF是否总是生成相同的结果。
				 */
				@Override
				public boolean deterministic() {
					return true;
				}
				
			});
			
			sqlContext.sql("select name ,StringCount(name) as strCount from user group by name").show();
				

谢谢你的赏金。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值