【HIVE】UDAF之截尾均值

本文介绍了在Hive中为了解决数据含有极端值导致均值失效的问题,作者通过创建一个UDAF(用户自定义聚合函数)来计算截尾均值。参照percentile函数的MR计算逻辑,设定截尾比例确定有效数据范围,然后对有效数据求均值。文章详细阐述了函数的实现过程,包括源码编写、编译、打包和在Hive中注册使用,并讨论了应用中可能遇到的数据精度损失和临界值处理优化问题。
摘要由CSDN通过智能技术生成

一、背景

    最近在做分析时,一旦数据含有极端值,均值常常失效,对此,试图通过截尾均值解决此问题。

    于是提出:在hive中新建一个UDAF(聚类函数),计算一组数值的截尾均值。

 

二、方案

    参考percentile()函数MR计算逻辑,通过截尾比例计算出有效数据区间,对有效数据区间求均值。

 

三、实现

1.函数源码:UDAFTrimAvg.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
import org.apache.hadoop.hive.shims.ShimLoader;
import org.apache.hadoop.io.LongWritable;

@Description(name = "trim_avg", 
    value = "_FUNC_(expr, pct) - Returns the trimmed mean of expr, expr should be integer, pc should be double (range: (0, 0.5)).")
public class UDAFTrimAvg extends UDAF {
    
    private static final Comparator<LongWritable> COMPARATOR;

    static {
        COMPARATOR = ShimLoader.getHadoopShims().getLongComparator();
    }

    // 定义state类,收集中间聚合结果
    public static class State {
        private Map<LongWritable, LongWritable> counts; // key计数
        private DoubleWritable pct; //单边截尾比例
    }

    // 重写compare方法, 比较两个key的大小
    public static class MyComparator implements Comparator<Map.Entry<Lo
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值