笔者今年年初面试了很多个大数据开发岗位。今天整理了一点常用场景的hiveSQL,很可能就能在面试中帮到你。
场景一:分组求TopN
name | subject | score |
---|---|---|
张三 | 物理 | 66 |
张三 | 化学 | 89 |
李四 | 物理 | 90 |
李四 | 化学 | 88 |
王五 | 物理 | 79 |
王五 | 化学 | 60 |
表-1
如表-1所示为三位同学的物理、化学成绩,现在需要求每一门科目中成绩排名前两名的同学。
可以通过如下HiveSQL查询:
select name, subject, score, rank from ( select name, subject, score, row_number() over(partition by subject order by score desc) rank from table_1 ) t1 where rank<=2;
输出结果如下:
name | subject | score | rank |
---|---|---|---|
李四 | 物理 | 90 | 1 |
王五 | 物理 | 79 | 2 |
张三 | 化学 | 89 | 1 |
李四 | 化学 | 88 | 2 |
表-2
解析:row_number()函数基于over 分组 order by 排序,为每一行分组记录返回一个序号,该序号从1开始,依次递增。通过在语句中加入限制条件rank<=2来筛选具体筛选TopN
场景二:行转列/列转行
现在我们需要把表-1中的数据转换为如下形式:
name | physical | chemistry |
---|---|---|
张三 | 66 | 89 |
李四 | 90 | 88 |
王五 | 79 | 60 |
表-3
使用hive实现需求的话,如下所示:
select name, sum(case when item='物理' then score else 0 end) as physical , sum(case when item='化学' then score else 0 end) as chemistry , from table_1 group by name
往期精选▼
Spark Shuffle调优之调节map端内存缓冲与reduce端内存占比
Flink中Checkpoint和Savepoint 的 3 个不同点
3种Flink State Backend | 你该用哪个?