Hive Percentile——分位数的计算(percentile)

一、什么是分位数

分位数(Quantile)是一个更具体的概率分布的特殊点。分位数将我们的数据集、数值或概率分布分成若干份,每一份都包含了统计意义上的相同比例的数据。

比如,第25分位数(第一四分位数,Q1)就是将数据或概率分布分成4份,每一份都包含了整个数据或概率分布中25%的数据。

hive的percentile()函数能够方便地计算分位数。

SELECT percentile(age, 0.25) FROM user;

以上的函数将查询user表中年龄的第一四分位数。

二、如何使用hive percentile

hive percentile()函数常用的语法如下:

percentile(expr, pct)

expr是要处理的字段名或者是表达式,pct是0到1之间的百分比。

对于一个expr序列,pct指定一个值,该值在expr序列中有比它小的值的比例为pct。

三、hive percentile的计算方式

hive percentile的计算公式如下:

percentile(expr, pct)       ├──  如果expr全为NULL,则返回NULL
                            ├──  否则,所有expr值都将加载到内存中
                            ├──  如果pct小于0或大于1,则返回NULL
                            ├──  如果只有一个expr值,返回该值
                            ├──  对于pct小于1的,排除NULL后,将expr值升序排列
                            ├──  对于pct为1,排除NULL后,将expr值降序排列
                            ├──  计算rank=floor(pct*(count-1))
                            └──  对于pct小于1的,返回排在排好序的结果中第rank个不是NULL的值。对于pct为1,返回排好序的结果中倒数第rank个不是NULL的值

四、hive percentile的示例

示例1:计算乘客年龄分位数

计算Titanic数据集中乘客年龄的中位数、四分位数和十分位数:

-- CREATE TABLE passengers(age INT, name STRING);

-- Load data:
LOAD DATA LOCAL INPATH '/path/to/titanic.csv' INTO TABLE passengers;

-- 查看中位数
SELECT percentile(age, 0.5) FROM passengers;

-- 查看四分位数
SELECT percentile(age, 0.25), percentile(age, 0.5), percentile(age, 0.75) FROM passengers;

-- 查看十分位数
SELECT percentile(age, 0.1) AS P10, percentile(age, 0.2) AS P20, percentile(age, 0.3) AS P30, percentile(age, 0.4) AS P40, percentile(age, 0.5) AS P50, percentile(age, 0.6) AS P60, percentile(age, 0.7) AS P70, percentile(age, 0.8) AS P80, percentile(age, 0.9) AS P90 FROM passengers;

示例2:计算 sales 表的 95th百分位数 (即P95)

在 sales 表的 amount 字段中查找第95个百分数值的数值,即P95:

SELECT percentile(amount, 0.95) as P95 FROM sales;

示例3:计算sales表中字段price的75th百分位数 (即P75)

计算sales表中字段price的75th百分位数 (即P75)

SELECT percentile(price, 0.75) as P75 FROM sales;

五、总结

hive percentile函数可以非常方便地计算分位数,只需要指定想得到的分位数比例,就可以得到对应的数值。

在数据分析、数据可视化等领域,分位数是一个非常重要的指标。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注