注意在偶数情况下,中位数会存在小数,特别注意!

hive里面倒是有个percentile函数和percentile_approx函数,其使用方式为percentile(col, p)、percentile_approx(col, p),p∈(0,1)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…p1,p2,p3…),即

 
percentile_approx(col,array(0.05,0.5,0.95),9999)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)percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999)

其输出结果长这样:

 
[0.0,4001.0,4061.0][0.0,4001.0,4061.0]

没法直接用啊!再加个转换:

 
explode(percentile_approx(cast(col as double),array(0.05,0.5,0.95),9999))as percentileexplode(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的时候很快就能跑出来了.

转自:https://blog.csdn.net/sinat_27339001/article/details/52189843

-------------------------------------------------------

中位数函数: percentile
语法: percentile(BIGINT col, p) 
返回值: double
说明: 求准确的第pth个百分位数,p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型
举例:

中位数函数: percentile
语法: percentile(BIGINT col, array(p1 [, p2]…)) 
返回值: array<double>
说明: 功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array<double>,其中为对应的百分位数。
举例:
select percentile(score,<0.2,0.4>) from udftest; 取0.2,0.4位置的数据

近似中位数函数: percentile_approx
语法: percentile_approx(DOUBLE col, p [, B]) 
返回值: double
说明: 求近似的第pth个百分位数,p必须介于0和1之间,返回类型为double,但是col字段支持浮点类型。参数B控制内存消耗的近似精度,B越大,结果的准确度越高。默认为10,000。当col字段中的distinct值的个数小于B时,结果为准确的百分位数
举例:

近似中位数函数: percentile_approx
语法: percentile_approx(DOUBLE col, array(p1 [, p2]…) [, B]) 
返回值: array<double>
说明: 功能和上述类似,之后后面可以输入多个百分位数,返回类型也为array<double>,其中为对应的百分位数。
举例:

直方图: histogram_numeric
语法: histogram_numeric(col, b) 
返回值: array<struct {‘x’,'y’}>
说明: 以b为基准计算col的直方图信息。
举例:
hive> select histogram_numeric(100,5) from dual;
[{"x":100.0,"y":1.0}]

示例:中位数、平均数计算方法:

select
avg(t1.price) as avg_price,
percentile(int(price), 0.5) as mid_price
from
dev.devXXXXX
group by
cate_id,
cate_name;

  

最新文章

  1. 配置struts2+spring,springmvc
  2. 快速上手RaphaelJS--Instant RaphaelJS Starter翻译(二)
  3. Emmet (Zen Coding) HTML基本语法
  4. 深入理解javascript函数系列第二篇——函数参数
  5. PowerShell命令卸载Win10内置应用
  6. java 22 - 4 多线程的代码实现的方式1
  7. word 排版问题
  8. linux之Gcc使用
  9. POJ 3281 Dining (网络流构图)
  10. bzoj 1096: [ZJOI2007]仓库建设 斜率優化
  11. (转载)PHP isset()函数作用
  12. 解析一下rtmp协议比较难懂的地方
  13. CVE-2014-1767 利用分析(2015.2)
  14. jquery easyui datagrid detailview groupview添加自定义视图view
  15. CUDA学习,查看device性能参数
  16. PAT1077: Kuchiguse
  17. Ubuntu下安装JDK详细教程
  18. 深度学习中数据的augmentation
  19. c++语言知识点汇总
  20. redisTemplate 总结

热门文章

  1. struts2自动接收表单数据
  2. matlab mex中C++内存全局共享和持久化
  3. JavaScript面向对象编程指南(第2版)》读书笔记
  4. 1Password:让一个密码记住所有密码
  5. ArcGIS for Android地图上实际距离与对应的屏幕像素值计算
  6. .NET:遇到并发问题,什么样的情况下需要自动重试?
  7. 修改SharePoint 2013中Search Topology时遇到的一些问题以及一些Tips
  8. 查看网络IP连接
  9. WinForm 窗口缩放动画效果
  10. Linux统计/监控工具SAR详细介绍