hiveSQL常见面试题
小编前几天去面试了一个大数据分析的岗位,学习了几个月信心满满的小编被无情的面试教育了,被教育的不是一些高深的算法理论,而是一些hiveSQL。
这些题小编真不是不会,场景都非常熟悉,但就是容易忘。今天小编整理了一点常用场景的hiveSQL,很可能就能在面试中帮到你。
场景一:分组求TopN
先看数据:
表-1好像把小编的数学成绩暴露了,现在需要求每一门科目,成绩排名前两名的同学。
使用HiveSQL常用的方式为:
Select * from table,
row_number() over(partition by item order by score desc) rank
where rank<=2;
输出结果为:
表-2解析:row_number()函数基于over对象分组、排序的记过,为每一行分组记录返回一个序号,该序号从1开始,依次递增,遇到新组则重新从1开始。也就是说,该函数计算的值表示每组内部排序后的顺序编号。
然后在语句中加入限制条件rank<=2来筛选具体选取top几。从最终的结果可以看出,语文成绩考试前两名的同学分别是建国和小编、数学成绩排名前两名的同学分别是建国和狗剩。
场景二:行转列/列转行
数据如下:
表-3现在需要转换为
表-4使用hive实现需求的话,可以使用:
Select
name,
sum(case when item=数学 then score end) as math,
sum(case when item=英语 then score end) as english,
From table
Group by name
解析:首先写出select name from table group by name, 因为select后有几个字段,最终输出就是几个字段,所以我们需要把目标数据的”math”和“english”两个字段想办法得出来。
之后可以对item字段所有枚举的结果进行case when判断,将score填值进入,因为最后我们需要对name做一下聚合,需要明确的是一般选取字段一定要出现在groupby里面。
聚合函数可以不用,所以我们在外面套一层sum做聚合,这样得到sum的结果和单人得分结果是一致的,因为我们以name做了一遍聚合,而每个用户对一门课程只有一个成绩,所以这样就可以得到最终结果。
那么最后如果需要将“表-4”的内容转换为“表-3”的内容应该怎么做呢?
一种比较好的方式是这样:
select table_4.name,
a.item,
a.score
from table_4
lateral view explode(
str_to_map(concat('math=',math,'&english=',english),'&','=')
) a as item,score;
解析:首先使用str_to_map函数将math字段与english字段拼接后的结果转换为map类型,然后通过侧视图和explode函数将其爆炸开,给生成的临时侧视图一个名字,取名a并给列名取名为item,score,因为explode(map)爆炸的结果是每一个item为行,key为1列,value为1列,这样就恰好形成我们想要的结果。这个示例理解起来稍微有点难度,大家不熟悉这些函数的用法的话,可以首先熟悉一下。
喜欢这篇文章的话请给我们点赞+收藏+评论吧~
作者 | Ai课工场
公众号 | Ai课工场
简介 | 这里是前沿技术知识聚集地,每周为你推送鲜活实用的提升干货!和小Ke同学一起分享你的所见所闻,领略人工智能、大数据、云计算等科技风采。公众号回复“资料”就可以领取自学资料大礼包!
转载说明 | 转载请说明出处,谢谢合作!~