HiveSQL动态实现多行区间分组维度

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

工作中接到一个报表需求,需要根据用户的授信额度,动态统计各个额度分段的人数

例如:维度,[0,500),

[500,1000),

[1000,1500),…


主要思路是使用爆炸函数posexplode

一、posexplode是什么?

posexplode是hive的一种爆炸函数,与explode类似,不过还额外增加了索引的返回值

二、使用步骤

1.配合侧视图lateral view

代码如下(示例):

SELECT  idx
FROM
(
	SELECT  split(space(10) ,'' ) AS x --space函数生成10个空格的字符串,split按空格拆分11行(为什么是11行,因为按空格切割,1分为2 )
)t lateral view posexplode(x) pe AS idx, blank --idx就是每一行的索引从0开始

2.返回结果

+------+
| idx  |
+------+
| 0    |
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
| 6    |
| 7    |
| 8    |
| 9    |
| 10   |
+------+

3.根据结果生成分段区间

代码如下(示例):

		SELECT  cast(idx AS string)                                                                                             AS num
		       ,cast( idx * 500 AS string )                                                                                     AS range_left
		       ,lead(cast( idx * 500 AS string ),1,'+∞') over(order by idx asc)                                                 AS range_right
		       ,concat('[',cast( idx * 500 AS string ),',',lead(cast( idx * 500 AS string ),1,'+∞') over(order by idx asc),')') AS quota_range
FROM
(
	SELECT  split(space(10) ,'' ) AS x --space函数生成10个空格的字符串,split按空格拆分11行(为什么是11行,因为按空格切割,1分为2 )
)t lateral view posexplode(x) pe AS idx, blank --idx就是每一行的索引从0开始

结果如下:

+------+-------------+--------------+--------------+
| num  | range_left  | range_right  | quota_range  |
+------+-------------+--------------+--------------+
| 0    | 0           | 500          | [0,500)      |
| 1    | 500         | 1000         | [500,1000)   |
| 2    | 1000        | 1500         | [1000,1500)  |
| 3    | 1500        | 2000         | [1500,2000)  |
| 4    | 2000        | 2500         | [2000,2500)  |
| 5    | 2500        | 3000         | [2500,3000)  |
| 6    | 3000        | 3500         | [3000,3500)  |
| 7    | 3500        | 4000         | [3500,4000)  |
| 8    | 4000        | 4500         | [4000,4500)  |
| 9    | 4500        | 5000         | [4500,5000)  |
| 10   | 5000        | +| [5000,+)    |
+------+-------------+--------------+--------------+

总结

如果你也遇到类似的需求,代码直接copy复用即可

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值