大数据面试-20210311

目录

 

基础题

1、谈谈Hadoop里面的压缩格式以及使用场景

思考题

2、Sqoop在导入数据的时候出现了数据倾斜,你有什么解决方案。另外,使用Sqoop的注意事项,你能列举出来几个?

智力题

3、小鹏汽车充电有两种类型,快充、慢充,有如下数据:


基础题

 

1、谈谈Hadoop里面的压缩格式以及使用场景

 

压缩格式比较

 

各种压缩性能测试

压缩比

压缩时间

可以看出压缩比越高,压缩时间越长,压缩比:Snappy < LZ4 < LZO < GZIP < BZIP2

 

 

总结:

  • 经过上面对比,每种压缩都有各自的优势与劣势,我们在选择使用哪种压缩时,需要根据场景来判断,不同的场景选择不同的压缩方式
  • 例如:选择高压缩比,那么对于cpu的性能要求要高,同时压缩、解压时间耗费也多;
  • 选择压缩比低的,对于磁盘io、网络io的时间要多,空间占据要多;
  • 选择对于支持分割的,可以实现并行处理,不支持split的需要空置block的大小如果一个文件太大不支持split只有一个map去处理太耗时。

 

关于压缩详细文章请参考博客:https://justdodt.github.io/2018/04/15/Hadoop-%E5%8E%8B%E7%BC%A9%E4%BB%8B%E7%BB%8D/

思考题

 

2、Sqoop在导入数据的时候出现了数据倾斜,你有什么解决方案。另外,使用Sqoop的注意事项,你能列举出来几个?

Sqoop底层运行的是只有Map阶段,没有Reduce阶段的任务

所以抽数的并行化主要涉及到两个参数:

num-mappers:启动N个map来并行导入数据,默认4个;

split-by:按照某一列来切分表的工作单元

 

sqoop命令中,--split-by id通常配合-m 参数使用。用于指定根据哪个字段进行划分并启动多少个maptask。

 

注意,当 -m 设置的值大于1时,split-by必须设置字段,且只能是int类型

 

另外,关于--split-by参数的深入理解大有学问:

 

1、split-by 根据不同的参数类型有不同的切分方法,如 int 型,Sqoop会取最大和最小split-by字段值,然后根据传入的num-mappers来 确定划分几个区域。比如 select max(split_by),min(split-by) from 得到的 max(split-by)和min(split-by) 分别为1000和1,而num-mappers(-m)为2的话,则会分成两个区域 (1,500)和(501-1000),同时也会分成2个sql给2个map去进行导入操作,最后每个map各自获取各自SQL中的数据进行导入工作。

 

  2、split-by即便是int型,若不是连续有规律递增的话,各个map分配的数据是不均衡的,可能会有些map很忙,有些map几乎没有数据处理的情况,就容易出现数据倾斜,所以一般split by的值为自增主键id

 

 

使用Sqoop有哪些注意事项(亲自踩坑)

1. 上游数据源数据中含有我们设置的Sqoop行分隔符,导致 1 条数据可能导出到下游就变成了 2 条甚至更多条

解决方案:更改Sqoop以及所有表的行分隔符,或者对含有行分隔符的数据进行特殊处理

 

2. 上游数据源中存在有 NULL 值数据,经过 Sqoop 接入到下游Hive表中之后,变成了 "null" 或者 "NULL"

解决方案:在Sqoop语句中加入 –null-string '\N' –null-non-string '\N',需要在表级设置 ' serialization.null.format'参数

Plain Text

alter table ${table_name} SET SERDEPROPERTIES('serialization.null.format' = '\\N'); 

3.确保导出目录不存在,且拥有对应的写入权限,否则可能会报目录存在异常或权限问题

4.有需要补充的内容欢迎大家私聊群主或者管理,后续更新上

智力题

 

3、小鹏汽车充电有两种类型,快充、慢充,有如下数据:

车辆 ID 充电时间  充电类型 

a 20200701 20:00:09  1

a 20200701 21:00:09   0

a 20200702 20:00:09  1

a 20200703 11:00:09   1

a 20200704 12:00:09   1

b 20200706 12:00:09   0

a 20200706 12:00:09   0

 

其中1为快充,0为慢充,求每辆车最长 连续快充次数 ,以上例子结果为

a 3

b 0 

请写出对应的SQL

SELECT t3.vcl_id, nvl(MAX(if(t2.cnt = 1, 0, cnt)), 0) AS max_cnt-- 最大次数,连续1次不称之为连续,记为0
from (select vcl_id from tbl group by vcl_id) t3 -- 车辆维度        
left join ( select vcl_id, tp , rn1 - rn2 as rn_group -- 间距, count(1)  as cnt -- 间距出现的次数    
from (select vcl_id  , tm , tp , row_number() over (partition by vcl_id order by tm asc )   as rn1 , 
row_number() over (partition by vcl_id,tp order by tm asc)    as rn2 
from tbl t  -- 明细事实表   
order by vcl_id, rn1, rn2 ) t1    
group by vcl_id,tp,rn1 - rn2) t2                  
on t3.vcl_id = t2.vcl_id                       
and t2.tp = 1 --- 连续快充
group by t3.vcl_id

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据架构师Pony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值