面试

1、面试

1.1 数据仓库(数据挖掘,ETL)理论

1.什么是数据仓库?

数据仓库是面向主题的、集成的、时变的和非易失的有组织的数据集合,支持管理决策制定。

2.基本的数据模型,区别,适用场景

ER模型、维度模型

3.数据仓库的基本架构

数据源、ETL、数据仓库、元数据、OLAP

4.数据仓库分层架构,每层的作用

数据缓冲层、数据明细层、数据模型层、数据集市层、数据应用层

5.实现数据增量抽取的方式(除了加时间戳外,其它方式)

1、时间戳
2、md5(col_all)

6.用过的ETL工具及报表工具,及特点

1、kettle
2、impala

7.雪花模型和星型模型的区别

一个是数据冗余度的区别,星型模型的数据冗余度比雪花型要高,另一个是查询的性能问题,星型模型的使用便捷性和查询性能要高于雪花型

8.OLAP和OLTP的区别

OLAP联机分析处理,OLTP联机事务处理

9.缓慢变化维度如何处理
10.项目中最重要或最需要注意的部分,如何处理?
11.元数据管理哪些方面?
12.数据抽取注意事项,如何保证?
13.拉链表的优缺点
14.数据质量管控如何实现?
15.事实维度表的类型有哪些
16.对于数据的注意事项
17.数据库三范式

1.2 Hadoop原理及操作

1.2.1 集群

1.用过的集群及规模

2+15,2T+200T,2.6.5
2+4,1T+100T,2.6.5
2+35,4T+1225T,2.6.0-cdh5.13.3

2.每个组件的基本作用

基本模块:
Hadoop 基础功能库:支持其他 Hadoop 模块的通用程序包。
HDFS :一个分布式文件系统,能够以高吞吐量访问应用的数据。
YARN :一个作业调度和资源管理框架。
MapReduce :一个基于 YARN 的大数据并行处理程序。
其他模块:
HBase :一个可扩展的分布式数据库,支持大表的结构化数据存储。
Hive :一个数据仓库基础架构,提供数据汇总和命令行的即席查询功能。
Spark :一个处理 Hadoop 数据的、高速的、通用的计算引擎。
ZooKeeper :一个用于分布式应用的高性能协调服务。

3.基本的命令

参考Hadoop集群基本命令

1.2.2 MapReduce

1.MapReduce工作原理
2.Hadoop提交任务的流程
3.MR图的绘制
4.MR的二次排序
5.YARN的原理,MR原理一样么?

以上五个参考Hadoop系列-Hadoop知识点 笔记

6.MapReduce的map数和reduce数控制

1.2.3 Hive

1.Hive SQL具体的函数使用

参考Hive常用函数

2.全局排序和分组排序的区别(Sort By,Order By,Cluster By,Distrbute By)

order by:会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)。只有一个reducer,会导致当输入规模较大时,需要较长的计算时间
sort by:不是全局排序,其在数据进入reducer前完成排序。
distribute by:按照指定的字段对数据进行划分输出到不同的reduce中。
cluster by:除了具有 distribute by 的功能外还兼具 sort by 的功能

3.UDF编写,关键是自己的处理具体问题的想法
4.hql的行转列,列转行

实现hive里横转纵的功能

1
2
3
4
5
select gmsfhm,  gddh1   from zb_dwa.DWA_R_JB_RYDHHMK t lateral view explode(split(t.gddh,','))a as gddh1 where gmsfhm='152301198209100568';
152632196712060315    ,13088573907,13034744906    
转化成                   
152632196712060315    13088573907
152632196712060315    13034744906

实现hive里纵变横的功能

1
2
3
4
5
6
7
8
9
10
11
12
原始:
sys_region (id,name)
1 a
1 b
2 c
2 d
select id,concat_ws(',',collect_set(name))
from sys_region
group by id;
结果:
1 a,b
2 c,d

5.Hive里的UDF有哪几种

用户自定义函数:UDF
用户自定义聚合函数:UDAF
用户自定义表生成函数:UDTF

6.count(distinct xxx)如何优化

select count (1) from (select distinct xxx from b) a;

7.数据倾斜会出现在什么情况下,如何处理

发生场景:
1.有聚合运算的时候
2.有join的时候
处理方案:
第一种方案:建临时表
第二种方案:将key通过随机数打散后运算,然后再重新拆分聚合
第三种方案:设置参数 set hive.exec.reducers.bytes.per.reducer以及set hive.optimize.skewjoin = true
第四种方案:大小表关联用map join,group by的时候设置参数

8.Hive几种join方式

inner join,只有进行连接的两个表中都存在与连接标准相匹配的数据才会保留下来。
left join,join操作符左边表中符合where子句的所有记录将会被返回。
right join,会返回右边表中所有符合where语句的记录
full join,会返回所有表中符合where语句条件的所有记录
笛卡尔积join,表示左边表的行数乘以右边表的行数等于笛卡尔结果集的大小。

9.Hive有哪几种文件存储格式,大概说一下原理

1.TEXTFILE为默认的存储格式,行式存储。如果建表的时候不特殊指定则采用这种格式存储,便于和其他工具(grep,sed和awk等)共享数据,也便于查看和编辑。但是相对于二进制文件,存储空间要大。
2.SequenceFile文件存储格式,行式存储。定义表结构时可以通过STORED AS SEQUENCEFILE语句指定。SequenceFile文件是含有键-值对的二进制文件,是Hadoop本身就可以支持的一种标准文件格式。SequenceFile可以在块级别和记录级别进行压缩,同时仍然可以支持按照块级别的文件分割,以方便并行处理。
3.RCfile文件存储格式,是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个记录在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
主要用到这三种。

10.Hive实现拉链表
11.条件写在join后面和写在where后面的区别

join是数据在查询范围内用join where 只获得符合条件的数据
对结果集:join不符合的显示的是null where 是不显示的

12.Hive的压缩格式及区别

使用压缩的优势是可以最小化所需要的磁盘存储空间,以及减小磁盘和网络I/O操作。但是,文件压缩过程和解压过程会增加CPU开销。
BZip2压缩率最高,但是同时需要消耗最多的COU开销。
GZIP是压缩率和压缩/解压缩速度上的下一个选择。
LZO和Snappy压缩率相比前面的2种要小但是压缩/解压缩速度要快。
GZIP和Snappy压缩的文件不可分割。

13.row_number和rank有啥区别
  • row_number()从1开始,按照顺序,生成分组内记录的序列,row_number()的值不会存在重复,当排序的值相同时,按照表中记录的顺序进行排列
  • RANK() 生成数据项在分组中的排名,排名相等会在名次中留下空位
  • DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位
    14.Hive分区,分桶表
    Hive分区是指按照数据表的某列或某些列分为多个区,分区从形式上可以理解为文件夹。
    分桶是相对分区进行更细粒度的划分,分桶将整个数据内容安装某列属性值得hash值进行区分。
    15.常用优化方式
    1.使用EXPLAIN查看执行计划。
    2.JOIN优化。1)将最大的表放置在JOIN语句的最右边。2)使用map-side JOIN。
    3.开启本地模式。
    4.开启并行执行。
    5.开启严格模式。
    6.调整mapper和reducer个数。
    7.JVM重用。
    8.开启压缩。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    一些调优参数
    set hive.groupby.skewindata=true; //当数据出现倾斜时,会自动进行负载均衡
    set hive.exec.compress.output=true; //hive最终输出是否压缩
    set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; //map的输出压缩方式
    set mapred.output.compression.type=BLOCK; //压缩类型,默认为RECORD,压缩单独的记录,BLOCK为块压缩
    set mapreduce.map.memory.mb=2049; //每个map的内存大小
    set mapreduce.reduce.memory.mb=2049; //每个reduce的内存大小
    set hive.exec.parallel=true; //控制同一个sql中的不同的job是否可以同时运行,默认为false
    set hive.exec.parallel.thread.number=4; //控制对于同一个sql来说同时可以运行的job的最大值,默认为8
    set mapred.max.split.size=256000000; //决定每个map处理的最大的文件大小,单位为B
    set mapred.min.split.size.per.node=100000000; //节点中可以处理的最小的文件的大小
    set mapred.min.split.size.per.rack=100000000; //机架中可以处理的最小的文件的大小
    set hive.merge.mapfiles=true; //在Map-only的任务结束时合并小文件
    set hive.merge.mapredfiles=true; //在Map-Reduce的任务结束时合并小文件
    set hive.merge.size.per.task=128000000; //合并文件的大小
    set hive.meger.smallfiles.avgsize=100000000; //当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件合并
    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; //hive的输入 InputFormat
    set hive.hadoop.supports.splittable.combineinputformat=true; //是否支持可切分的combineinputformat
    set mapred.reduce.tasks=10;
    set hive.exec.reducers.bytes.per.reducer=750000000; //控制reducer个数
    set hive.exec.compress.output=true; //hive最终输出是否压缩
    set mapred.compress.map.output=false; //hadoop参数,map输出是否压缩
    set mapred.output.compress=true; //hadoop参数,reduce输出是否压缩
16.exist怎么实现比较快
17.left semi join什么特点
18.不用order by 实现全局排序
19.不用开窗函数 实现分组 topN
20.SQL怎么解决数据倾斜(不用map side join)

1.2.4 Spark

1.Spark 2.0新特性

1.2.5 HBase

1.HBase工作原理
2.rowkey设计原理
3.HBase分区
4.HBase和Hadoop有什么区别,脱离HDFS能存在么?

1.2.6 Kafka

1.Kafka接数的原理

1.2.7 ZooKeeper

1.3 常用SQL

1.3.1 基于Hive的SQL及常用优化

1.求连续五天通过一个卡口的车辆
2.求一段数字排列中不连续的排列
3.求一个学生的成绩占总成绩的百分比

思路:通过表自关联实现

4.字段a,b,c,值为1000,2000,中国;3000,4000,美国,给定1500,求中国

思路:(写udf实现,使用luce索引)java
1)写sql
2)自选方案

5.分组求top N
6.行转列,列转行具体写法

1.3.2 基于Mysql的SQL优化

1.3.3 基于Oracle的SQL优化

1.4 Linux Shell

1.4.1 常用命令

1.5 编程语言

1.6 项目经验