今日内容
- 前言
- sql题目训练
- spark部分面试题(一)
前言
今天是面试集锦第七篇,希望可以一直坚持下去,将最好的知识和总结分享给大家。等面试系列完结之后,会进行汇总,分大数据 不同节点进行汇总分类。
sql题目训练
sid,dt,dz,fz,sp
a,2020-01,3000,4000,5000
a,2020-02,4000,9800,5000
a,2020-03,3000,3333,6555
a,2020-04,3000,4444,5000
a,2020-05,4444,4000,4546
a,2020-06,3000,4000,2888
a,2020-07,2333,1879,5000
a,2020-08,4366,4000,5000
b,2020-01,1222,2322,2322
b,2020-02,3232,322,122
b,2020-03,2322,2232,6555
b,2020-04,3000,322,232
b,2020-05,2232,2232,232
b,2020-06,3000,3232,2888
b,2020-07,2333,3232,2121
b,2020-08,121,3232,5000
c,2020-01,1222,2322,2322
c,2020-02,222,322,122
c,2020-03,1211,2232,6555
c,2020-04,2122,322,232
c,2020-05,343,2232,232
c,2020-06,3434,3232,2888
c,2020-07,4564,8888,2121
c,2020-08,8888,9999,12000T1、求出所有“年销售总额>12000”的店铺及其年度销售总额
select
sid,
sum(dz,fz,sp) as year_sum
from
shop_sale
group by sid
having sum(dz,fz,sp)>12000;T2、求出每家店铺“月总额最高的三个月”的销售数据
select
sid,
dt,
dz,
fz,
sp
from
(
select
sid,
dt,
dz,
fz,
sp,
row_number() over(partition by sid order by (dz+fz+sp) desc) as rn
from
shop_sale) t where rn<=3T3、求出每家店铺“月总额最低的三个月”的销售数据
select
sid,
dt,
dz,
fz,
sp
from
(
select
sid,
dt,
dz,
fz,
sp,
row_number() over(partition by sid order by (dz+fz+sp) asc) as rn
from
shop_sale) t where rn<=3T4、写出近一周内每天排名前三的栏目及点击量
id,lanmu,dt
1,a,2021-2-21
2,a,2021-2-21
3,a,2021-2-22
4,a,2021-2-23
5,a,2021-2-24
6,a,2021-2-25
7,b,2021-2-22
8,b,2021-2-23
9,b,2021-2-23
10,b,2021-2-24
11,b,2021-2-25
12,b,2021-2-25
13,c,2021-2-23
14,b,2021-2-23一次点击为一条记录
每天内 排名前三 分组topN
- 限定数据为7天内,datediff(current_date())<=7
- 求每天内 排名前三; 一条记录为1个点击 需要先汇总 每个栏目 在每天的点击量为多少;进而再求出每天里点击量排名前三的栏目
- 首先 根据栏目、时间分组 count 求出每个栏目、每天的点击量
- 之后 使用编号函数 按照时间(每天)分区 点击量倒序排序
- 过滤 编号小于等于3的数据 即为结果
with tmp as
(select
lanmu,
dt,
count(1) as cnt
from
tb
where datediff(current_date(),dt)<=7
group by lanmu,dt)
======》a,2021-02-21,2
a,2021-02-22,3
b,2021-02-21,6
b,2021-02-22,3select
dt,
lanmu,
cnt
from
(
select
lanmu,
dt,
cnt
row_number() over(partition by dt order by cnt desc) rn
from
tmp ) t1 where rn<=3
spark部分面试题
1、Spark 和mr程序有什么区别
1)mr只能做离线计算,如果实现复杂计算逻辑,一个MR搞不定,就需要将多个MR按照先后顺序连成一串,一个MR计算完成后会将计算结果写入到HDFS中,下一个MR将上一个MR的输出作为输入,这样就要频繁读写HDFS,网络IO和磁盘IO会成为性能瓶颈。从而导致效率低下。比如夜间执行mr任务,第二天查看结果,mr程序 稳定,安全。
2).spark既可以做离线计算,又可以做实时计算,提供了抽象的数据集(RDD、Dataset、DataFrame、DStream),有高度封装的API,算子丰富,并且使用了更先进的DAG有向无环图调度思想。可以对执行计划优化后在执行,并且可以数据可以cache到内存中进行复用。
但mr和spark的shuffle时数据均落本地磁盘。
2、Mr程序和spark谁运算快?
没有绝对的谁快、谁慢,但在生产环境中大部分情况下还是spark运算比较快。对于比较复杂的数据运算,mr的话需要一个个的糖葫芦一样串起来,下一个mr需要读取上一个mr的reduce输出到hdfs的结果数据,这样频繁的跟hdfs进行IO、网络 交互,所以运算很慢;而spark 不用,下游直接去上游的磁盘里对应的分区拉取数据就ok,不用跟hdfs进行交互。并且的话,mr程序是分区 且区内进行排序的,而spark可以排序也可以不排序。但二者中间结果都落地本地磁盘。
3、请你说一下spark的执行流程
spark on yarn cluster 模式
- client向ResourceManager申请资源,返回一个applicationId
- Client上传 spark jars下的jar包、自己写的程序jar包和配置文件
- ResourceManager找一个资源充足的nodemanager
- 让它从hdfs上下载jar包和配置,并启动ApplicationMaster(Driver)
- Applicationmaster向ResourceManger申请资源
- ResouceManager上的ResourceSchedule 自行调度寻找合适的nodemanager,并把nodemanager的信息返回给applicationmaster
- Applicationmaster跟相应的nodemanager进行通信
- Nodemanager从hdfs上下载资源
- Nodemanager启动executor
- Executor启动之后反向向Driver(Applicationmaster)进行注册
4、广播变量是什么?有什么作用?
- 广播变量是Driver端将数据广播到属于该application的executor,多个executor可以相互传递数据,可以提高效率
- 作用:一般为了实现mapside join。在drive端将数据广播出去,driver端获取到一个引用,在函数内部可以使用到这个引用。这个引用会伴随着每一个task发送到executor上,可以通过这个引用获取到事先广播好的数据。
- 如何广播:在driver端,使用sc.brodcast(阻塞的同步方法),返回一个引用
- 广播变量一旦广播出去,就不可以再改变,除非重新广播。
- 注意要广播的对象必须事先序列化接口
5、什么是闭包
在一个函数的内部,引用到了函数外部的一个变量,这种现象就叫做闭包。
函数 是在Driver端定义,但是却是在executor端执行的。
更多学习、面试资料尽在微信公众号:Hadoop大数据开发