文章目录
- 一、大数据面试题_Hive篇
-
- (一)Hive表与性能优化
-
- 1、hive 内部表和外部表的区别
- 2、 hive 有索引吗
- 3、sort by 和 order by 的区别
- 4、如何使用过 Hive 解析 JSON 串
- 5、Hive 表关联查询,如何解决数据倾斜的问题?
- 6、Hive 的 HSQL 转换为 MapReduce 的过程?
- 7、Hive 底层与数据库交互原理?
- 8、Hive 的两张表关联,使用 MapReduce 怎么实现?
- 9、请谈一下 Hive 的特点?
- 10、请说明 hive 中 Sort By,Order By,Cluster By,Distrbute By 各代表什么意思?
- 11、写出 hive 中 split、coalesce 及 collect_list 函数的用法(可举例)?
- 12、Hive 的函数:UDF、UDAF、UDTF 的区别?
- 13、说说对 Hive 桶表的理解?
- 14、所有的 Hive 任务都会有 MapReduce 的执行吗?
- 15、hive 小文件过多怎么解决 解决 hive 小文件过多问题
- 16. hive 优化有哪些?
- (二)Hive数据存储与调度
一、大数据面试题_Hive篇
(一)Hive表与性能优化
1、hive 内部表和外部表的区别
未被 external 修饰的是内部表(managed table),被 external 修饰的为外部表 (external table)
区别:
- 内部表数据由 Hive 自身管理,外部表数据由 HDFS 管理;
- 内部表数据存储的位置是 hive.metastore.warehouse.dir(默认: /user/hive/warehouse),外部表数据的存储位置由自己制定
(如果没有 LOCATION, Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件 夹,并将属于这个表的数据存放在这里); - 删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会 删除元数据,HDFS 上的文件并不会被删除;
2、 hive 有索引吗
-
Hive 支持索引,但是 Hive 的索引与关系型数据库中的索引并不相同,比如,Hive 不支持主键或者外键。
-
Hive 索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少 MapReduce 任务中需要读取的数据块的数量。
-
在可以预见到分区数据非常庞大的情况下,索引常常是优于分区的。
-
虽然 Hive 并不像事物数据库那样针对个别的行来执行查询、更新、删除等操作。 它更多的用在多任务节点的场景下,快速地全表扫描大规模数据。但是在某些场 景下,建立索引还是可以提高 Hive 表指定列的查询速度。(虽然效果差强人意)
-
索引适用的场景
适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都 要重建索引以构建索引表。 -
Hive 索引的机制如下:
hive 在指定列上建立索引,会产生一张索引表(Hive 的一张物理表),里面的字 段包括,索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量; v0.8 后引入 bitmap 索引处理器,这个处理器适用于排重后,值较少的列(例如, 某字段的取值只可能是几个枚举值) 因为索引是用空间换时间,索引列的取值过多会导致建立 bitmap 索引表过大。
但是,很少遇到 hive 用索引的。说明还是有缺陷 or 不合适的地方的。
3、sort by 和 order by 的区别
-
order by 会对输入做全局排序,因此只有一个 reducer(多个 reducer 无法保证全 局有序)只有一个 reducer,会导致当输入规模较大时,需要较长的计算时间。
-
sort by 不是全局排序,其在数据进入 reducer 前完成排序. 因此,如果用 sort by 进行排序,并且设置 mapred.reduce.tasks>1, 则 sort by 只 保证每个 reducer 的输出有序,不保证全局有序。
4、如何使用过 Hive 解析 JSON 串
hive 处理 json 数据总体来说有两个方向的路走
- 将 json 以字符串的方式整个入 Hive 表,然后通过使用 UDF 函数解析已经导入 到 hive 中的数据,比如使用 LATERAL VIEW json_tuple 的方法,获取所需要的列名。
- 在导入之前将 json 拆成各个字段,导入Hive 表的数据是已经解析过得。这将需要使用第三方的 SerDe。
5、Hive 表关联查询,如何解决数据倾斜的问题?
1) 倾斜原因
- map 输出数据按 key Hash 的分配到 reduce 中,由于 key 分布不均匀、业务数据本身的特点、建表时考虑不周等原因造成的 reduce 上的数据量差异过大。
- a) key 分布不均匀;
- b) 业务数据本身的特性;
- c) 建表时考虑不周;
- d) 某些 SQL 语句本身就有数据倾斜;
如何避免:对于 key 为空产生的数据倾斜,可以对其赋予一个随机值。
2)解决方案
1. 参数调节: