提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
工作中接到一个报表需求,需要根据用户的授信额度,动态统计各个额度分段的人数
例如:维度,[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复用即可