在Hadoop生态系统中,窗口函数通常在Hive或Impala等SQL-on-Hadoop工具中使用。Hadoop窗口函数是一种强大的数据分析工具,它们允许你对数据集中的一组行(称为“窗口”)进行操作,而不需要复杂的连接或子查询。这些函数包括:
- ROW_NUMBER():为窗口中的每行分配一个唯一的序列号。
- RANK():为窗口中的每行分配一个排名,如果有并列,则后续的排名会比前一个非并列排名大1。
- DENSE_RANK():与RANK()类似,但是后续的排名与前一个不同的排名大1,而不是跳过。
- LEAD(col, n):获取当前行之后第n行的列值。
- LAG(col, n):获取当前行之前第n行的列值。
- FIRST_VALUE(col):获取窗口中的第一行的列值。
- LAST_VALUE(col):获取窗口中的最后行的列值。
窗口子句用于定义窗口函数将操作的行集,包括以下几个部分:
- PARTITION BY:指定用于分区数据的列。
- ORDER BY:指定用于排序每个分区内行的列。
- ROWS BETWEEN:指定窗口中包含的行的范围,相对于当前行。
使用场景
-
计算累计总数或平均值:使用SUM()或AVG()窗口函数,结合OVER子句定义窗口,可以计算每个员工在其部门内的累计总数或平均薪水。
SELECT employee_id, department, SUM(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS running_total, AVG(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS running_average FROM employee_data; -
识别顶部和底部执行者:使用RANK()或DENSE_RANK()窗口函数,可以为每个部门内的员工分配排名。
SELECT employee_id, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_within_department FROM employee_data; -
检测随时间变化或趋势:使用LAG()或LEAD()窗口函数,可以比较当前行的值与前一行或后一行的值,以检测变化或趋势。
SELECT employee_id, department, salary, salary - LAG(salary, 1) OVER (PARTITION BY department ORDER BY salary_date) AS salary_change FROM employee_data; -
实现复杂业务逻辑:窗口函数可以用来实现需要跨行比较值的复杂业务逻辑,例如识别部门内薪水前10%的员工。
SELECT employee_id, department, salary, ROUND(PERCENT_RANK() OVER (PARTITION BY department ORDER BY salary DESC), 2) AS salary_percentile FROM employee_data WHERE ROUND(PERCENT_RANK() OVER (PARTITION BY department ORDER BY salary DESC), 2) <= 0.1;
通过掌握Hadoop窗口函数的使用,你可以解锁强大的数据分析能力,从你的Hadoop数据中获得宝贵的洞察力。