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:原因:

  1. key分布不均匀
  2. 业务数据本身存在问题
  3. 建表考虑不周
  4. 某些sql本身就有数据倾斜

B:解决:

  1. 给key一个随机的值,打散key。
  2. 有数据倾斜的时候做负载均衡,设置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中,最终完成聚合操作。
  3. SQL语句的调节:
    • 选用join key分布最均匀的表作为驱动表
    • 大小表join的时候,让维度较小的表先进内存,进行map端join。
    • 大表join的时候,把空值的key变成一个字符串加上一个随机数,把倾斜的数据分布到不同的reduce上面。
    • count distinct大量相同的特殊值。

5. Hive中Hive SQL转换成MR的过程

  1. sql进行语法解析,将sql转换为抽象树AST Tree
  2. 遍历AST TREE,抽象出查询的基本组成单元Query Block
  3. 遍历Query Block,翻译为执行操作数 Operator Tree
  4. 逻辑层优化器对Operator Tree进行优化变换,合并不必要的Reduce Sink Operator,减少shuffle操作
  5. 遍历Operator Tree翻译为Mapreduce任务
  6. 物理层优化器进行MapReduce任务变换,最终生成执行计划

6. Hive中元数据保存方式有哪些?

  1. 内嵌模式:将元数据保存在本地内嵌的Derby数据库,内嵌的Derby数据库每次只能访问一个数据文件,不支持多个会话连接。
  2. 本地模式:将元数据保存在本地独立的数据库,不是Derby数据库,这个可以支持多会话连接。
  3. 远程模式:把元数据保存在远程独立的数据库中,避免每个客户端都去安装mysql数据库。

7. Hive中的数据类型

简单数据类型:

  1. 整型:tinyint,smallint,int,bigint
  2. 字符串类型:string,varchar,char
  3. 时间日期类型:date,timestamp
  4. 布尔类型:boolean
  5. 浮点型:double,float

复合类型:

  1. Array
  2. map
  3. struct
  4. uniontype

8. 分区表和分桶表有什么区别?

分区:是按照数据表中的某列或者某些列分为多个区,区从形式上可以理解为文件夹。比如我们收集某些大型网站的日执行器,如果每天的日志数据都放在一张表,导致表数据内容巨大,在查询的时候会进行全表扫描。

分桶:分桶是对分区进行更细粒度的划分,分桶将数据表内容按照某列属性值的hash的属性值进行分区,如果按照name属性分为3个桶,就是对name属性值的hash值取模,按照取模结果对数据进行分桶。

  

原文地址:https://www.cnblogs.com/qidi/p/11748703.html