提示
Hive SQL 教程 欢迎使用。提供建议、纠错、催更等加作者微信: gairuo123(备注:sql )和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Hive SQL 的 ntile 函数用于将分组数据按照顺序切分成n组,并返回当前切片值。如果切片不均匀,默认增加第一个切片的分布。它把有序的数据集合「平均分配」到指定的数量(n)个桶中, 将桶号分配给每一行。如果不能平均分配,则优先分配较小编号的桶,并且各个桶中能放的行数最多相差 1。
Hive SQL 的 ntile 函数语法为:
bigint ntile(bigint <n>) over (partition by <col1>[, <col2>…]
[order by <col1>[asc|desc][, <col2>[asc|desc]…]] [<windowing_clause>]))
参数:
返回:
它需要家配合窗口函数一起使用,将窗口分组数据按照顺序切片,并返回切片值。
有以下数据,是一个班级名单:
'''
id|name|class|b_year|
--|----|-----|------|
1|张涛 | 1| 1950|
2|王琳 | 2| 2010|
3|赵丹丹 | 1| 1996|
4|李成 | 2| 2011|
5|赵天成 | 3| 2000|
6|田迪 | 1| 1988|
7|王卫栋 | 2| 1966|
8|周平 | 1| 1988|
9|武明 | 3| 1977|
'''
我们按出生年 b_year 排序后,将其分为3个组(分桶分箱),ntile 会把组号(桶号)标注出来:
SELECT
name,
b_year,
ntile(3) over(ORDER by b_year ASC) as nt3
FROM
students
'''
name|b_year|nt3|
----|------|---|
张涛 | 1950| 1|
王卫栋 | 1966| 1|
武明 | 1977| 1|
田迪 | 1988| 2|
周平 | 1988| 2|
赵丹丹 | 1996| 2|
赵天成 | 2000| 3|
王琳 | 2010| 3|
李成 | 2011| 3|
'''
桶号为 1 的是前 33%,为 3 的为 66% 以后。
ntile 还可以将数据用窗口分组,再在分组(窗口)内标注桶号:
SELECT
name,
class,
b_year,
ntile(3) over(PARTITION by class ORDER by b_year ASC) as nt3
FROM
students
'''
name|class|b_year|nt3|
----|-----|------|---|
张涛 | 1| 1950| 1|
田迪 | 1| 1988| 1|
周平 | 1| 1988| 2|
赵丹丹 | 1| 1996| 3|
王卫栋 | 2| 1966| 1|
王琳 | 2| 2010| 2|
李成 | 2| 2011| 3|
武明 | 3| 1977| 1|
赵天成 | 3| 2000| 2|
'''
以上先将数据按班级(class)进行窗口分组,然后在窗口内进行分桶。
更新时间:2021-04-10 17:24:30 标签:hive hql 分箱 分桶