Hive
1.内部表和外部表的区别?
在导入数据时,外部表并没有把数据移动到自己对应的数据仓库的目录下,也就说外部表中的数据并不是由它自己来管理的!
在删除表的时候,hive将会把属于表的元数据和数据全部删掉,而删除外部表的时候,hive仅仅删除外部表的元数据,数据是不会删除的。
2. hive四种排序方式的区别是什么?
order by:对输出结果进行全局排序,这就意味着只有一个reducer才能实现,但是数据量过大的时候,效率就很低。在严格模式下必须配合limit使用。
sort by:不是全局排序,只是在reducer之前完成排序,只保证了而每个reducer中数据按照指定字段进行排序,是局部排序。
distribute by:是按照指定字段划分到不同的reduce文件中,与sort by一起使用时应该注意,distribute by必须放在前面。
cluster by:可以看做是distribute by+sort by,它具备二者的功能,但是只能实现倒序排序。
3. 数据库和数据仓库的区别?
- 数据库是面向事务的,数据仓库是面向主题的
- 数据库存储的是业务数据,数据仓库存储的是历史数据
- 数据库是为了捕获数据存在的,数据仓库是为了分析数据存在的
- 数据仓库并不是大型的数据库,也不是为了替代数据库而出现的,它是在数据库大量存在的情况下,为了进一步挖掘数据资源,为了决策产生的。
4.Hive中的数据倾斜问题都有哪些,怎么解决?
A:原因:
- key分布不均匀
- 业务数据本身存在问题
- 建表考虑不周
- 某些sql本身就有数据倾斜
B:解决:
- 给key一个随机的值,打散key。
- 有数据倾斜的时候做负载均衡,设置hive.map.aggr=true,hive。groupby。skewindata=true。有数据倾斜的时候就进行负载均衡,生成的计划会有两个Mr Job。第一Job的map输出结果会随机分布到reduce中,每个reduce做部分聚合操作,并输出结果,这样处理的目的是Group By Key可能会分发到不同的Reduce中从而达到负载均衡的目的。第二个Job的目的是根据预处理的数据结果按照Group By Key分布到Reduce中,保证相同的Group By Key分布到同一个Reduce中,最终完成聚合操作。
- SQL语句的调节:
- 选用join key分布最均匀的表作为驱动表
- 大小表join的时候,让维度较小的表先进内存,进行map端join。
- 大表join的时候,把空值的key变成一个字符串加上一个随机数,把倾斜的数据分布到不同的reduce上面。
- count distinct大量相同的特殊值。
5. Hive中Hive SQL转换成MR的过程
- sql进行语法解析,将sql转换为抽象树AST Tree
- 遍历AST TREE,抽象出查询的基本组成单元Query Block
- 遍历Query Block,翻译为执行操作数 Operator Tree
- 逻辑层优化器对Operator Tree进行优化变换,合并不必要的Reduce Sink Operator,减少shuffle操作
- 遍历Operator Tree翻译为Mapreduce任务
- 物理层优化器进行MapReduce任务变换,最终生成执行计划
6. Hive中元数据保存方式有哪些?
- 内嵌模式:将元数据保存在本地内嵌的Derby数据库,内嵌的Derby数据库每次只能访问一个数据文件,不支持多个会话连接。
- 本地模式:将元数据保存在本地独立的数据库,不是Derby数据库,这个可以支持多会话连接。
- 远程模式:把元数据保存在远程独立的数据库中,避免每个客户端都去安装mysql数据库。
7. Hive中的数据类型
简单数据类型:
- 整型:tinyint,smallint,int,bigint
- 字符串类型:string,varchar,char
- 时间日期类型:date,timestamp
- 布尔类型:boolean
- 浮点型:double,float
复合类型:
- Array
- map
- struct
- uniontype
8. 分区表和分桶表有什么区别?
分区:是按照数据表中的某列或者某些列分为多个区,区从形式上可以理解为文件夹。比如我们收集某些大型网站的日执行器,如果每天的日志数据都放在一张表,导致表数据内容巨大,在查询的时候会进行全表扫描。
分桶:分桶是对分区进行更细粒度的划分,分桶将数据表内容按照某列属性值的hash的属性值进行分区,如果按照name属性分为3个桶,就是对name属性值的hash值取模,按照取模结果对数据进行分桶。