美文网首页
hive获取中位数

hive获取中位数

作者: 我念东风终不负 | 来源:发表于2018-03-15 16:33 被阅读4905次

hive里面倒是有个percentile函数和percentile_approx函数,其使用方式为percentile(col, p)、percentile_approx(col, p),p∈(0,1)
其中percentile要求输入的字段必须是int类型的,而percentile_approx则是数值类似型的都可以
其实percentile_approx还有一个参数B:percentile_approx(col, p,B),参数B控制内存消耗的近似精度,B越大,结果的准确度越高。默认为10,000。当col字段中的distinct值的个数小于B时,结果为准确的百分位数。
如果我要求多个分位数怎么办呢?,可以把p换为array(p1,p2,p3…),即

percentile_approx(col,array(0.05,0.5,0.95),9999)

如果不放心的话,就给col再加个转换:
percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999)

其输出结果长这样:
[0.0,4001.0,4061.0]

没法直接用啊!再加个转换:
explode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentile

输出结果就长这样了:
percentile
0
4001
4061
实际操作中,发现有时在计算分位数的时候mapper会卡在0%。
前面说过,如果distinct的值小于B,就会返回精确值,那么个人猜测是因为后台执行的过程是先做了一个select distinct limit B,然后排序得到分位数。如果distinct值特别多的情况下,仅仅是去重就是一个巨大的运算负担,更别说排序了。而当把B从10000调到100的时候很快就能跑出来了

相关文章

  • hive获取中位数

    hive里面倒是有个percentile函数和percentile_approx函数,其使用方式为percenti...

  • hive安装

    hive安装 1. hive获取 2. 环境配置 3.hive 初始化 4.启动 Hive 客户端,测试

  • Hive表血缘关系获取

    hive血缘关系获取比较容易,方案也比较成熟。 org.apache.hadoop.hive.ql.tools.L...

  • hive_查询select

    借鉴hive官网:https://hive.apache.org/ 经典语句 获取当前数据库 查表名 where子...

  • Hive字段血缘关系获取

    Hive源码在获取字段级别血缘关系上提供了org.apache.hadoop.hive.ql.hooks.Line...

  • hive从查询中获取数据插入到表或动态分区

    首先,hive不支持单条数据的insert和update。 Hive的insert语句能够从查询语句中获取数据,并...

  • hive集群迁移

    一、主要任务 1、建立hive表2、建立分区3、验证数据4、配置调度任务5、校验任务 二、hive建表语句 获取所...

  • 常见数据结构设计题

    设计RandomPool结构(LintCode657) 设计并查集结构 前缀树 随时可以获取中位数的流 Rando...

  • Hive获取最新分区

    为了增加代码健壮性,有时候获取数据表分区不能写死固定的时间,或者sysdate(-1)。 因此需要获取表的最新分区...

  • hiveSQL 巧用日期转换

    20210923转2021-09-23 2021-09-23转20210923 获取hive当前时间

网友评论

      本文标题:hive获取中位数

      本文链接:https://www.haomeiwen.com/subject/vpvhqftx.html