HIVE开窗函数

ETL,SQL面试高频考点——HIVE开窗函数(基础篇)

目录标题

  • ETL,SQL面试高频考点——HIVE开窗函数(基础篇)
      • 一,窗口函数介绍
      • 二,开窗函数
      • 三,分析函数分类
        • 1,排序分析函数:
          • 实列解析
          • 对比总结
        • 2.聚合分析函数
        • 3.用spark 自定义HIVE用户自定义函数
      • 后续更新中~

一,窗口函数介绍

  • 窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
  • 窗口函数由开窗函数和分析函数构成,窗口函数就是既要显示聚集前的数据,又要显示聚集后的数据,简单讲,就是你查询的结果上,多出一列值(可以是聚合值或者排序号),所以分析函数可以分为两类:聚合分析函数和排序分析函数
  • 基本语法:
<窗口分析函数> over (partition by <用于分组的字段> order by<用于排序的列名>) 

二,开窗函数

1,概要
开窗函数就是over()函数,就是限定一个窗口,来显示分析函数的结果
2,开窗函数一般有两种(固定形式,不可更改)

-- 第一种
over(partiton by ... order by ...)
-- 第二种
over(distribute by ... order by ...)

3,区别

  • partiton by是一个一个reduce处理数据的,所以使用全局排序order by distribute
  • distribute by是多个reduce处理数据的,所以使用局部排序sort by

三,分析函数分类

1,排序分析函数:
  • RANK() OVER();
  • ROW_NUMBER() OVER();
  • DENSE_RANK() OVER();
  • NTILE(n) OVER();
实列解析
  • 创建一个学生成绩表
create table if not exists sc(name string,score int)
row format delimited fields terminated by '\t';
  • 导入数据到HIVE
    张三 100
    李四 90
    王五 80
    刘六 100
    田七 70
load data local inpath '数据文件本地路径' into table sc

1.使用 RANK() OVER()

  • 特点:并列跳跃排序
  • 不开窗sql实现rank()
    sql语句
SELECT b.name,b.Score,(
select count(a.score)
from sc a
WHERE a.score>b.score) +1 as Ranking
FROM sc b
ORDER BY b.score DESC
  • 结果
    HIVE开窗函数_第1张图片
  • 原理总结:
    第一部分实现表的降序排序

sql语句

SELECT b.name,b.Score
FROM sc b
ORDER BY b.score DESC

HIVE开窗函数_第2张图片
第二部分实现,假设给你一个分数,如何计算出他的Rank排名:
比如图中的王五是95分,大于他的分数有[100,100],count统计个数为2,加1就能得到他的rank排名3,其他如此类推,所以每个同学的rank排名为成绩在他之上的人数+1

sql语句

--计算大于分数的集合个数
(select count(a.score)
from sc a
WHERE a.score>b.score) +1 as Ranking
  • 使用开窗语句:
FROM sc
SELECT name,score,rank()

你可能感兴趣的:(sql,hive)