目录
9、hive里面经常用到的几个不同的排序分别是什么,有什么区别?
30、hdfs里面,写入数据(上传文件)和读取数据(下载文件),过程流程和原理是什么?
31、hdfs里面,常用的操作命令有哪些?上传、下载、合并等等。
33、如果现在,做数据的增量抽取,如何在重复抽取的过程中,避免出现重复的数据?
51、数据增长幅度突然剧增,要从哪几个角度去思考到底哪里出现了问题?
52、一个分区表,一个非分区表,如何用非分区表中的字段作为分区表的分区值?
56、hive中 一个表格有ID 和登陆时间,怎么找出昨天登陆次数两次的用户?
57、hive 怎么截取字符串最后两位?除了substr 还有没有别的方法?
68、多表查询是不是一定要用嵌套,还有什么情况下可以考虑不用嵌套
74、用union all合并两个表,新表中怎么查询某个数据原本是什么表,用什么语句
75、有个文件需要周一早上8点运行,用linux语句怎么运行?(不能借助kettle)
79、hive中order by,sort by, distribute by, cluster by作用以及用法;
1、hive数据库和其他的数据库有什么区别?
hive数据库是使用hdfs存储数据的,oracle数据库使用.dbf文件存储数据
hive数据库使用mr引擎计算数据,oracle有自己自带的executor进行计算
hive的语句运行延迟比较高,oracle延迟很低
hive支持的容量比较大,可以支持TB PB,但是oracle只能支持GB
hive数据库没有约束条件的部分,oracle有约束
hive没有索引,oracle有索引
2、传统数仓和大数据数仓的区别
传统数仓主要是结构化的数据,大数据数仓有结构化,半结构化,非结构化的数据
传统数仓数据量为GB,TB;大数据数仓数据量为pb级
传统数仓用oracle存储,大数据数仓用hdfs,hbase存储
传统数仓主要处理离线数据,大数据数仓既可以处理离线数据,也能处理实时数据
3、你们使用的hadoop是什么环境什么版本的?
hadoop 开源版 2.8
hadoop cdh版本 5
4、分桶的作用是什么?
进行表格连接的查询加速;加快表格的抽样查询。
5、分桶的数量你是如何决定的?
总的文件大小/(block size*2) = 分桶数量
6、hive里面经常用到的函数有哪些?
聚合函数 sum avg min max count
单行函数
数字 abs round floor ceil power
字符串 substr concat concat_ws replace instr split translate upper lower initcap lpad rpad length trim ltrim rtrim get_json_object
时间日期函数 current_timestamp unix_timestamp from_unixtime add_months months_between date_add datediff last_day
数据类型转换 cast
数组 array size collect_list collect_set explode
映射 map map_keys map_values
分析函数
排名 row_number rank dense_rank
平移 lag lead
逻辑函数 nvl case...when...
7、进行数据的同比和环比有什么方法?
lag lead
表连接 select * from a join b on a.year=b.year+1 and a.month=b.month;
8、hive表连接和其他数据库有什么区别?
hive使用left semi join替换子查询嵌套;
表连接不能使用on后面的非等值查询。
9、hive里面经常用到的几个不同的排序分别是什么,有什么区别?
order by 是整个表格的数据当成一个进程进行整体的排序
sort by 可以根据 mapred.reduce.tasks进行分组的设置,每个组分别进行排序
cluster by 只能对该列进行升序排序
distribute by 本身没有排序功能,需要和sort by一起
10、Hive中的有哪几种存储格式?
Textfile:默认存储格式,行存储;
Sequencefile:含有键值对形式的二进制文件格式,行存储;
Rcfile:行列相结合的存储方式,行列式存储;
Orcfile:优化后的Rcfile存储格式,使用最多。
11、项目中经常用的结构有哪些?
如果表格比较小会使用textfile,中大型的表格使用orc
12、表格的压缩格式你们用的什么?
textfile gzip
sequencefile BLOCK RECORD
orc zlib
13、hive的优化
1. 可以通过explain查看一下sql语句运行的步骤、逻辑、使用方法、数据的类型、前后的顺序等等内容
2. 减少查询过程中使用到的数据量 分区 分桶 不使用select * 先筛选数据再计算或者再连接表格
3. 调整表格的存储格式
4. 根据表格的结构设置map或者reduce的数量
14、怎么设置map?
map的数量和两个开关有关,有一个merge的合并开关和一个map.tasks的数量开关,
使用 表格的总数量大小/tasks和merge设置取最小值,计算每一个map需要运行的数量大小,查看map运行的数量是否有很大的明显的差距
15、怎么设置reduce?
如果我们的表格是列比较少但是行比较多的大表,那么通过reduce.tasks设置表格分桶的数量,
然后通过 select * from t distribute by 列; 进行表格的分桶。
16、什么叫做数据倾斜呢?
在进行表格的查询和计算过程中,如果有的进程计算的数据很大,有的进程计算的数据比较少,有的部分进程就需要等待其他数据大的进程运行完成才能结束。所以计算过程中资源的分布发生了不合理的现象。
17、有没有遇到过数据倾斜的问题?数据倾斜的表现是什么?
reduce的进程在日志里面卡在了99或者100的部分不动了。
18、有哪些情况会导致数据倾斜呢?
1. map和reduce的设置不合理
2. 对表格进行了去重的结果查询
3. 大小表格进行数据的查询
4. key值分配不均
5. 进行数据查询的时候有大量的空值数据参与了数据的运算
19、怎么解决数据倾斜的现象呢?
1. 设置 mapred.map.tasks; mapred.reduce.tasks;
2.在句子中尽可能少的使用去重统计
3.
-- 3.1使用hive里面的优化器 /*+ mapjoin(小表的名字) */
-- 3.2调整表格的前后顺序,hive里面,永远读取Join前面的表格
-- 3.3对表格设置分桶
4. 使用hive里面的万能开关,来解决异常数据的问题
set hive.groupby.skewindata=true; --万能方法
set hive.map.aggr=true; --任务执行中合并文件的大小
set hive.merge.size.per.task=256000000;--调整每个map处理数据量的次数,
set mapred.map.tasks=10; ----这里设置的是每一个map要处理的map数量
5. 填充空值,用字符串+随机值进行空值的填充
nvl(被计算的列, concat('rand_',rand()))
20、mapjoin优化器的原理是什么?
将小表格的数据放入到内存里面,让大表去读取内存中小表的数据进行数据的匹配和连接
mapjoin是将小表格先读取到内存中,然后用大表格去匹配内存中小表的数据。
21、两表连接后能得出什么结果
A id B id
1 1
2 2
3 4
select * from A left join B on a.id=b.id and a.id=2;
2 2
1 null
3 null
select * from A left join B on a.id=b.id where a.id=2;
2 2
22、a表有4条数据 b表有3条数据 请问左连接有几条数据
最少是4条 最多是6条
1 5
2 5
3 5
4
1 1
2 1
3 1
4
23、hadoop有哪三大组件?
hdfs :hadoop的分布式文件管理系统
mapreduce : 数据的计算引擎
yarn : 资源管理和调度系统
24、hadoop 平台,你用过和知道哪些不同的组件?
离线的部分:sqoop yarn hdfs mapreduce hive
实时的部分:flume(日志信息的收集) kafka(消息队列的处理) hbase(一种列式存储的数据库) spark(基于内存的计算引擎) flink(流式处理的计算引擎)
25、hadoop里面,hdfs数据块是多大一块?
128M
26、数据默认保存几份?
3份
27、hdfs里面由哪几个组件构成?
datanode namenode secondarynamenode
28、hdfs里面的几个组件,分别有哪些功能和作用?
secondarynamenode:服务器数据的收集,将信息传递给namenode
namenode:负责和客户端进行沟通
datanode:负责存储数据
29、hadoop的基础服务有哪几个?
datanode namenode secondarynamenode jps resourcemanager nodemanager
30、hdfs里面,写入数据(上传文件)和读取数据(下载文件),过程流程和原理是什么?
读取数据:
1.客户端申请某个位置的文件或者数据
2.namenode响应申请,并且将文件和数据所在的datanode节点信息列表返回给客户端
3.客户端根据节点信息去向datanode申请数据的读取
4.datanode响应成功给客户端
5.客户端开始申请读取block1
6.datanode返回block1的数据
7.持续申请后面的其他block数据
8.datanode持续的返回剩下的其他数据
写入数据:
1.客户端要申请写入一个数据
2.namenode审核文件和数据的合法性
3.namenode返回允许的响应
4.客户端开始申请写入
5.namenode返回datanode的节点信息
6.客户端找到datanode开始申请写入数据
7.datanode同意进行数据写入
8.客户端开始上传数据
8.1 datanode开始向其他的datanode申请备份
8.2 其他的datanode同意备份
8.3 开始备份
8.4 备份完成
9. datanode回应客户端表示写入成功
31、hdfs里面,常用的操作命令有哪些?上传、下载、合并等等。
hadoop fs -put
hadoop fs -get
hadoop fs -appendToFile
32、加载数据到数据库的表,使用什么方法?
load data inpath 'hdfs路径' into table 库名.表名 partition(分区字段=分区值);
load data local inpath 'linux路径' into table 库名.表名 partition(分区字段=分区值);
hadoop fs -put linux文件的位置和名字 表格在hdfs的路径
33、如果现在,做数据的增量抽取,如何在重复抽取的过程中,避免出现重复的数据?
增量抽取的数据,会放在每天的分区里面中,然后通过删除今天的分区达到避免重复数据出现的效果。
34、如何删除分区呢?
alter table 表名 drop partition(分区字段=’分区值‘);
load data inpath '路径' into table 库名.表名 partition(分区字段=分区值);
insert overwrite table 表名 partition(分区字段=分区值) select * from 另一个表名;
35、如果某个数据有问题,更新这个数据?
1. -get 这个文件,修改文件本身,删除hdfs原文件,在-put上传上去
2. 通过select语句修改数据本身写入另一个表,然后删除原表,重新命名新表
3. 如果是orc类型的分桶表格,通过打开ACID的方法,进行数据的update更新
36、内部表和外部表的区别?
1. 内部表是通过create table创建的,外部表是create external table进行创建的
2. 外部表需要通过location指定表格映射的文件夹
3. drop table的时候,内部表会删除文件夹、结构和数据,外部表只会删除mysql中存储的表格的结构
4. 一般像日志和埋点数据这种数据量非常大的表格,都会保存在外部表中,计算结果会保存在内部表中
37、动态分区和静态分区的区别?
1. 静态分区可以load data和insert两种方式添加数据,动态只能通过insert的方式添加数据
2. 静态需要自己指定分区的内容,动态是通过查询结果自动指定和分配的
3. 动态需要打开动态分区和非严格模式的开关
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
4. 一般情况下都是使用静态分区,动态的处理数据的速度相对慢一点
38、为什么分桶可以对表格的联合查询加速呢?
因为分桶可以减少表格笛卡尔积的数量
39、分区和分桶的区别?
1. 分区是通过partitioned by (新字段) 进行分区设置的,分桶是通过clustered by (已有字段) 进行分桶设置的
2. 分区是以文件夹的方式分开保存数据的,分桶是分成不同的文件保存数据的
3. 分区是在查询分区字段的时候加快查询速度,分桶是对分桶字段进行表格的联合查询的时候进行联合查询加速的
40、怎么进行数据的抽取?
在hive数据库中,可以通过sqoop进行数据的抽取,有全量和增量两种不同的方法,增量一般是通过lastmodified的方式进行数据抽取的,也可以通过分区表的方式抽取数据
41、yarn的原理和流程?
ResourceManager:在整个系统中,有且仅有一个的服务,负责调配Container
NodeManager:负责启动和管理以及监控Container
AppMaster:进行数据计算 Container:容器,一部分服务器的资源
42、mapreduce的原理和流程是什么?
input:先获取在计算过程中所需要的数据
split:对大的数据进行切割的操作,将数据分成一块块的
map:数据的映射。将分配好的数据,给到不同的进程去运行
shuffle:每个进程单独的对自己拿到的数据进行计算(对每个数据进行数据拆分(分区)并且进行排序,保存在硬盘上,从硬盘上读取数据,并且进行计算,结果再次排序)
reduce:将单独的数据进行总体汇总的计算过程
finalize:将计算结果输出
43、shuffle的基本流程?
数据进行分区--sort排序--存入硬盘--从硬盘读取数据--聚合计算等等--数据排序
44、表连接(喜欢问左连接,项目中一般不用右连接):
1 1
2 2
4 3
a left join b on a.id=b.id and a.id=2
2 2
1 null
4 null
a left join b on a.id=b.id where a.id=2
2 2
45、分析函数:
row_number -- rank -- dense_rank -- lag -- lead
46、时间的方法:
获取当前时间:from_unixtime(unix_timestamp()) current_timestamp
47、hive的优化
-- 尽可能减少查询和运算过程中的数据量
分区、分桶、查询列不要使用*、先筛选再聚合和连接表。
-- 修改表格存储的结构和压缩的方法
小表:textfile gzip
中大表:orc zlib
-- 设置不同的map和reduce数量
-- 有一些不同的hive数据库的set开关
aggr 聚合开关
parallel 并行开关等
48、Hadoop的构架
使用hdfs进行数据的存储
使用mapreduce进行数据的计算
使用yarn进行资源的调度
使用hive编写sql语句
使用mysql存储表格的元数据结构
49、数据库分层
业务数据的来源:业务系统
50、merge into的基本语法
将目标表格和原表格进行主键的对比,如果主键一致,就更新原表数据到目标表格中,如果主键不一致,就将原表的数据插入到目标表格中。
51、数据增长幅度突然剧增,要从哪几个角度去思考到底哪里出现了问题?
如果平常数据量增加都很正常,那么我的逻辑控制、变量的设置、数据的获取方式应该都没有什么问题,如果今天突然新增了数据,首先先去确认表格的数据是否都是重复的数据、是否都是空的数据、是否都是异常数据等等,然后往上游的系统进行数据的追溯,查看上游给我们的数据本身是否有问题,如果上游数据很存储数据一致,就找上游协调问题,如果上游数据和存储数据不一致,那么就查找是否有特殊数据导致逻辑出现问题。
还可以查看其他的表格,看是否也有突增的数据,考虑是否是调度的工具出现了问题。
52、一个分区表,一个非分区表,如何用非分区表中的字段作为分区表的分区值?
直接做动态分区就好了,使用 insert overwrite table 分区表 partition(分区字段) select xxxx from 非分区表;
53、linux 怎么创建文件和文件夹?
文件 touch
文件夹 mkdir
54、怎么找出HDFS中文件的路径?
hdfs里面没有直接查找文件的方法,但是可以通过元数据库例如Mysql里面有一个sds表格,通过Like模糊查询这个文件的名字,然后找到它所在的位置。
55、hive怎么动态的筛选出今天之前的数据?
(current_timestamp,-1)
dt<from_unixtime(unix_timestamp(),'yyyy-MM-dd')
56、hive中 一个表格有ID 和登陆时间,怎么找出昨天登陆次数两次的用户?
提取出年月日的数据,将年月日和用户的Id共同分组,找出组的行数等于2的就可以了
57、hive 怎么截取字符串最后两位?除了substr 还有没有别的方法?
将字符串转换成数组,然后通过数组的下标去除最后两位,然后通过concat_ws再还原成字符串。
58、hive 中一个分区表怎么删除其中一个分区?
alter table 表名 drop partition (分区字段=分区值);
59、两张十万数据的表,进行左连接后发现数据膨胀会怎么处理
先对数据进行筛选,然后再进行表格的连接;
或者将数据计算之后的结果存储到临时表中,然后用临时的中间表进行表格的连接;
或者对两个表格进行分桶。
60、如何查看执行计划
使用 explain 来查看sql的执行计划
61、优化器的是如何进行优化的
优化器是强制的修改表格sql语句的运行逻辑,然后在某种情况下可以达到优化的效果。
62、sql语句的去重
insert overwrite table 表名 select distinct * from 表格;
insert overwrite table 表名 select 列名 from 表格 group by 列;
insert overwrite table 表名 select 列名 from (select 表名.*,row_number() over(partition by 列 order by 1) r from 表) where r=1;
63、hive怎么更新数据效率更高
最高的方法,使用hadoop fs将数据下载下来,然后使用Linunx命令更新之后再上传。
64、hive的sql语句是怎么运行的
hive窗口中编写sql语句,然后会去Mysql里面进行表格结构和位置的查询,如果表格结构没有问题,那么就会将sql语句拆分成不同的关键字,然后调用mapreduce对应关键字的java脚本模板,如果mr的模板文件运行没有问题,就会调用yarn进行资源的申请和分配,然后使用mr进行数据的计算,最后将计算的结果再回显到hive数据的窗口中。
65、hive中的数据插入流程是怎么样的
就是hdfs数据写入的流程
66、除了存储过程还有没有其他的?
函数、触发器、包
67、什么情况下会用到触发器
前置触发器:在数据写入到表格之前,先对写入的数据进行检查,查看数据是否符合写入表格的要求
后置触发器:当数据已经写入到表格了,对表格的数据进行同步更新或者是表格操作日志的记录等等
68、多表查询是不是一定要用嵌套,还有什么情况下可以考虑不用嵌套
除了嵌套,还有表联合查询,exists()进行多表查询也可以
69、怎么提取数据,数据抽取方式
全量抽取:在小表或者是维度表格获取是计算后的表格,先对表格进行truncate,然后再全量插入
增量抽取:我们项目组里面,一般是以天为单位,进行日期分区的增量抽取
镜像对比的抽取:一般用来历史记录上进行数据的对比更新或者数据的补录等等
70、小文件产生的原因
每次insert插入产生小文件
分桶产生小文件
系统本身产生的文件。比如每天的财务数据,数据量不是特别大
71、小文件处理方法
在map执行前合并小文件,减少map数:
CombineHiveInputFormat 具有对小文件进行合并的功能(系统默认的格式)
set mapred.max.split.size=112345600;
set mapred.min.split.size.per.node=112345600;
set mapred.min.split.size.per.rack=112345600;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
这个参数表示执行前进行小文件合并,前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的),进行合并。
72、数据倾斜的业务场景
(1)空值产生的数据倾斜
场景说明
在日志中,常会有信息丢失的问题,比如日志中的 user_id,如果取其中的 user_id 和用户表中的 user_id 相关联,就会碰到数据倾斜的问题。
解决方案
解决方案 1:user_id 为空的不参与关联
select * from log a join user b on a.user_id is not null and a.user_id = b.user_idunion allselect * from log c where c.user_id is null;
解决方案 2:赋予空值新的 key 值
select * from log a left outer join user b on case when a.user_id is null then concat('hive',rand()) else a.user_id end = b.user_id
总结
方法 2 比方法 1 效率更好,不但 IO 少了,而且作业数也少了,方案 1 中,log 表 读了两次,jobs 肯定是 2,而方案 2 是 1。这个优化适合无效 id(比如-99,’’,null)产生的数据倾斜,把空值的 key 变成一个字符串加上一个随机数,就能把造成数据倾斜的 数据分到不同的 reduce 上解决数据倾斜的问题。
改变之处:使本身为 null 的所有记录不会拥挤在同一个 reduceTask 了,会由于有替代的 随机字符串值,而分散到了多个 reduceTask 中了,由于 null 值关联不上,处理后并不影响最终结果。
(2)不同数据类型关联产生数据倾斜
场景说明
用户表中 user_id 字段为 int,log 表中 user_id 为既有 string 也有 int 的类型, 当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进 行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中
解决方案
把数字类型 id 转换成 string 类型的 id
select * from user a left outer join log b on b.user_id = cast(a.user_id as string)
73、hive中怎么给数据打标签
使用分析函数进行数据的统计,然后可能需要对数据case when 进行判断。
74、用union all合并两个表,新表中怎么查询某个数据原本是什么表,用什么语句
select * from
(select a.*,sysdate,'a' from a
union all
select b.*,sysdate,'b' from b);
75、有个文件需要周一早上8点运行,用linux语句怎么运行?(不能借助kettle)
crontab
0 8 * * 1
76、把一个列变成一个数组都有什么函数
collect_list(列名) collect_set(列名)—去重
77、降序排序空值排在前面还是后面?
最前 (空值默认最大)
可以在最后加nulls last/first 改变空值顺序
78、hive SQL和SQL的区别
Hive-sql不支持等值连接,而sql支持;
Hive-sql不支持“Insert into 表 Values()”、UPDATA、DELETE操作,而sql支持;
Hive-sql不支持事务,而sql支持。
79、hive中order by,sort by, distribute by, cluster by作用以及用法;
cluster by 列名:对这个列进行升序排序
order by 列名 asc|desc:对这个列进行升序或者降序的排序
distribute by 列名 [ sort by 列名 asc|desc ]:相当于对这个列进行了一个分区的操作,如果要实现排序功能,需要和sort by 结合使用。
order by是全局排序,sort by是组内排序。distribute by sort by可以结合桶表使用,给桶中的数据排序。
80、数据清洗
缺失值清洗:确定范围,去除不需要的字段,填充缺失内容,重新取数
格式内容清洗:统一格式,去除多余字符,校验字段内容
逻辑错误清洗:去重、去除不合理值、修正矛盾内容
非需求数据清洗:删除不需要的字段