Hadoop窗口函数简介及示例

103 阅读2分钟

在Hadoop生态系统中,窗口函数通常在Hive或Impala等SQL-on-Hadoop工具中使用。Hadoop窗口函数是一种强大的数据分析工具,它们允许你对数据集中的一组行(称为“窗口”)进行操作,而不需要复杂的连接或子查询。这些函数包括:

  1. ROW_NUMBER():为窗口中的每行分配一个唯一的序列号。
  2. RANK():为窗口中的每行分配一个排名,如果有并列,则后续的排名会比前一个非并列排名大1。
  3. DENSE_RANK():与RANK()类似,但是后续的排名与前一个不同的排名大1,而不是跳过。
  4. LEAD(col, n):获取当前行之后第n行的列值。
  5. LAG(col, n):获取当前行之前第n行的列值。
  6. FIRST_VALUE(col):获取窗口中的第一行的列值。
  7. LAST_VALUE(col):获取窗口中的最后行的列值。

窗口子句用于定义窗口函数将操作的行集,包括以下几个部分:

  • PARTITION BY:指定用于分区数据的列。
  • ORDER BY:指定用于排序每个分区内行的列。
  • ROWS BETWEEN:指定窗口中包含的行的范围,相对于当前行。

使用场景

  1. 计算累计总数或平均值:使用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;
    
  2. 识别顶部和底部执行者:使用RANK()或DENSE_RANK()窗口函数,可以为每个部门内的员工分配排名。

    SELECT
      employee_id,
      department,
      salary,
      RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_within_department
    FROM
      employee_data;
    
  3. 检测随时间变化或趋势:使用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;
    
  4. 实现复杂业务逻辑:窗口函数可以用来实现需要跨行比较值的复杂业务逻辑,例如识别部门内薪水前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数据中获得宝贵的洞察力。