今日内容
- 一道sql题目训练
- 两道spark面试题
sql题目训练
延续上一篇数据
店铺id,时间,电子类,服装类,食品类
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,12000
求哪些店铺电子类产品的销售有过连续3月增长由题意,此题是一道连续性增长问题,思路:先过滤求出所有的增长的月份记录,
再使用编号函数,进行编号,进而求差,分组,条件 count =3 过滤出结果 并去重 求出店铺id即可
with tmp as
(
select
sid,
count(1) as cnts
from
(
select
sid,
(cast(substr(dt,6) as int)-rn) as dif
from
(
select
sid,
dt,
row_number() over(partition by sid order by dt asc) as rn
from
(
select
sid,
dt
from
(
select
sid,
dz,
dt,
lag(dz,1,null) over(partition by sid order by dt asc) as next_dz ) t1
where next_dz>dz ) t2 ) t3 ) t4 group by sid,dif )
select sid from tmp where cnts>=3 group by sid
两道spark面试题
1、什么是rdd
Rdd是一个分布式的可容错的抽象的大数据集合,它本身不存储数据,里面放的是对数据的描述信息,比如数据要从哪里读,数据怎么运算等。
它有以下特点:
- 分区。每个RDD都有自己的分区,分区的多少决定着task的并行度,但并不是分区越多,效率越高,这还和运算资源有关。
- Compute 计算函数。对RDD进行操作,实际上是对它里面的分区进行操作,这个函数作用在它的每个分区上。
- RDD与RDD彼此之间存在着依赖关系,可以根据依赖关系划分stage、恢复失败的任务。父RDD与子RDD的依赖关系:宽依赖和窄依赖。宽依赖会有shuffle的产生,会划分stage,而窄依赖没有shuffle产生。RDD的容错机制就是依靠 父RDD与子RDD之间的依赖关系。
- 最优位置。即将executor上的task调度到数据所在的机器上,要求worker和datanode部署在同一个节点上,通过和namenode的交互获取数据块的位置信息
- 分区器。如果要发生shuffle,要使用分区器,默认使用HashPartitioner,分区器决定着数据到下游的哪个分区中。
2、spark streaming 是 Exactly-Once 吗?
流计算引擎对状态一致性的保证:
常用的几种语义:
exactly once 准确一次
at least once 至少一次 数据不会有丢失 但可能重复
at most once 至多一次 数据可能有丢失 但不会重复spark-streaming 实现了exactly-once 吗
spark-streaming 可以保证exactly-once
主要有两种
一种是聚合性操作
先局部进行聚合操作 然后将结果收集到Driver端进行聚合 之后再将结果存入到有事务特性的数据库中,比如mysql具体描述:数据经过聚合之后 ,数据量已经变得很少了,可以将计算好的结果收集到Driver端。
在Driver端获取偏移量,然后将计算好的结果和偏移量,使用支持事务的数据库,比如mysql,在同一个事务中将偏移量和
计算好的数据一起写入到数据库,保证同时成功;而如果失败的话,事务会回滚,让任务重启,接着上一次成功的偏移量
继续读取还有一种是非聚合性操作(幂等性)
在Driver端获取偏移量,在Executor中使用(函数内部使用到外部的对象,闭包)
将计算好的结果和偏移量同时写入到Hbase或者elasticsearch 同一行中(hbase不支持事务,但支持行级事务)
如果数据写入成功,但是偏移量未更新成功,则沿着这个分区内偏移量最大的那个开始重新读取、处理数据
并写入hbase 覆盖掉原来的数据 实现幂等性
更多学习、面试资料尽在微信公众号:Hadoop大数据开发