如何解决hive同时计算多个分位数的问题
2016-08-15 11:20
2001 查看
众所周知,原生hive没有计算中位数的函数(有的平台会有),只有计算分位数的函数percentile
在数据量不大的时候,速度尚可。但是数据量一上来之后,完全计算不出来。
那么如何解决这个问题呢,我们可以使用 row_number() over()通过两次排序来解决同时计算多个分位数,速度飞快。
比如我们需要计算mkt_mcc_storeidx表下以mkt_label,mccgroup,month分组,value_mccgroup的分位数
第一步:利用row_number() over()给value_mccgroup在分组里排序,记录下排名
第二步:计算mkt_label,mccgroup,month分组下的数据总数
第三步:join前两步的结果,取rank=你需要计算的分位数位置,想计算多少个分位数就计算多少个
第四步:再排一次序,这次数据量就已经少了很多了,毕竟每组里面只有几个数据,记录排名
第五步:得到具体的分位数
第六步:行转成列,所有分位数计算完毕
后来查看了下SQL代码的执行树,发现percentile利用了map来存数据,怪不得这么耗内存,其实时间久并不是算的时间久,是因为内存不够了,系统一直在回收内存
而rank over 仅仅就是个排序而已
在数据量不大的时候,速度尚可。但是数据量一上来之后,完全计算不出来。
那么如何解决这个问题呢,我们可以使用 row_number() over()通过两次排序来解决同时计算多个分位数,速度飞快。
比如我们需要计算mkt_mcc_storeidx表下以mkt_label,mccgroup,month分组,value_mccgroup的分位数
第一步:利用row_number() over()给value_mccgroup在分组里排序,记录下排名
第二步:计算mkt_label,mccgroup,month分组下的数据总数
第三步:join前两步的结果,取rank=你需要计算的分位数位置,想计算多少个分位数就计算多少个
第四步:再排一次序,这次数据量就已经少了很多了,毕竟每组里面只有几个数据,记录排名
第五步:得到具体的分位数
第六步:行转成列,所有分位数计算完毕
后来查看了下SQL代码的执行树,发现percentile利用了map来存数据,怪不得这么耗内存,其实时间久并不是算的时间久,是因为内存不够了,系统一直在回收内存
而rank over 仅仅就是个排序而已
相关文章推荐
- 如何解决hive同时计算多个分位数的问题
- 同时承担多个项目,如何高效平衡解决问题
- eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?
- 求助:TelephonyManager.listen 监听使用的问题--如何实现TM同时监控多个状态的改变
- eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?
- 如何解决有限无限同时上网的问题
- Struts迭代问题解决:如何在一行显示多个记录(同一字段)
- div ul li 嵌套后如何解决增加多个li后ul高度自适应问题
- 如何解决spark写hive慢的问题
- 求助:TelephonyManager.listen 监听使用的问题--如何实现TM同时监控多个状态的改变
- div ul li 嵌套后如何解决增加多个li后DIV高度自适应问题
- 在集群中部署多个服务器如何解决SESSION问题?
- 在arcgis使用python脚本进行字段计算时是如何解决中文问题的
- div ul li 嵌套后如何解决增加多个li后ul高度自适应问题
- 关于如何用ISA解决内网多个网段上网的问题 推荐
- eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?
- 如何加快数模计算以及如何解决数模计算的收敛性问题
- php如何解决多线程同时读写一个文件的问题
- hive sql解决关联条件中不等值连接问题及累计值的计算
- 如何使用 BindingSource 绑定 ListBox,同时解决绑定 List<T> 后修改数据源不能同时刷新界面显示的问题