Hive SQL 的 ntile 分组切片函数

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>]))

参数:

  • n:必填,代表切片的数量,为 BIGINT 类型;
  • partition by [, …]:至少指定 1 个开窗口的列;
  • order by col1[asc|desc][, col2[asc|desc]…]:可选,指定返回结果的排序方式。

返回:

  • 返回 BIGINT 类型

它需要家配合窗口函数一起使用,将窗口分组数据按照顺序切片,并返回切片值。

案例

有以下数据,是一个班级名单:

'''

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)进行窗口分组,然后在窗口内进行分桶。

posted @ 2023-08-14 19:58  平平淡淡以明志  阅读(699)  评论(0编辑  收藏  举报