大数据的那些面试题及答案(三)Hive ---阿善重要
文章目录
1.什么是hive
hive是基于Hadoop的一个用于处理大数据的数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
2.为什么要用hive
帮助我们更高效的完成数据分析,MapReduce代码烦杂开发效率低,有了Hive之后,hive使用类SQL的语法完成数据分析,大大提高编写MapReduce的效率·。
3.hive几种基本表类型
内部表、外部表、分区表、桶表
4.内部表(管理表)和外部表的区别
内部表(managed table):
(1) 也叫管理表,数据由hive自身管理,数据存储位置为 hive,metastore,warehouse.dir
(2) 对数据拥有完全的控制权限,删除表时存储在RDBMS上的元数据和存储在HDFS上的数据全部被删除。
(3) 默认创建的表是管理表(内部表)
外部表(external table):
(1) 数据由HDFS管理,数据的存储位置由自己制定。
(2) 删除表时之删除存储在RDBMS上的元数据,存储在HDFS上的数据不会被删除
(3) 需要用external关键字来创建外部表
(4) 外部表可以建立在已经存在的数据上而无需load
(5) 外部表不能使用truncate(清空),因为没有权限。
5.Hive数据仓库与数据库的异同
(1)查询语言不同:hive是hql语言,mysql是sql语言。
(2)数据存储位置不同:hive存储在HDFS上,mysql是存储在磁盘上。
(3)底层执行原理:hive底层是将hql语言转成mapreduce,mysql是excutor执行器。
(4)数据延迟性:hive没有索引,所以查询慢,延迟性高,mysql有索引,查询快,延迟性低。
(5)数据规模:hive存储的数据量大,mysql之存储一些少量的业务数据。
(6)数据更新:hive只能读,不能写,mysql支持数据更新。
6.Hive 自定义函数
UDF 一进一出: 处理原文件内容某些字段包含 [] “”
UDAF 多进一出: sum() avg() max() min()
UDTF 一进多出: ip -> 国家 省 市
7.Hive中4种排序的区别
(1)order by 会对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
(2)sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只保证每个reducer的输出有序,不保证全局有序。
(3)distribute by根据distribute by指定的内容将数据分到同一个reducer。
(4)Cluster by 除了具有Distribute by的功能外,还会对该字段进行排序。因此,常常认为cluster by = distribute by + sort by
8.把数据加载到hive表中?
(1)从本地文件系统中导入数据到Hive表:load data local inpath ‘文件路径’ into table 表名 ;
(2)从HDFS上导入数据到Hive表:load data inpath ‘文件路径’ into table 表名;
(3)查询方式导入hive:从别的表中查询出相应的数据并导入到Hive表中;
(4)在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。
9.hive创建表的方式及区别
(1)普通创建 (创建后会有表结构)
create table if not exists student(id string, name string)
row format delimited fields terminated by '\t';
- 1
- 2
- 3
(2)ike克隆表(只带过来表结构)
create table if not exists student like stu ;
- 1
- 2
(3)as select查询创建(数据和表结构都带过来)
create table if not exists student as select id, name from stu;
- 1
- 2
10.hive元数据存放的位置及区别
(1)内嵌模式:将元数据保存在本地内嵌的derby数据库中,内嵌的derby数据库每次只能访问一个数据文件,也就意味着它不支持多会话连接。
(2)本地模式:将元数据保存在本地独立的数据库中(一般是mysql),这可以支持多会话连接。
(3)远程模式:把元数据保存在远程独立的mysql数据库中,避免每个客户端都去安装mysql数据库。
11.Hive的分组方式
(1)row_number() 是没有重复值的排序(即使两天记录相等也是不重复的),可以利用它来实现分页
(2)dense_rank() 是连续排序,两个第二名仍然跟着第三名
(3)rank() 是跳跃排序的,两个第二名下来就是第四名
13.描述数据中的null,在hive底层如何存储
null在hive底层默认是用"\N"来存储的
14.hive的架构
由上图可知,Hive架构主要包括如下组件:CLI(command line interface)、JDBC/ODBC、Thrift Server、HWI(Hive WEB Interface) 、metastore和Driver(Complier、Optimizer和Executor),这些组件可以分为两大类:服务端组件和客户端组件。
客户端组件
1、CLI:命令行接口,是最常用的一种用户接口,CLI启动时会同时启动一个Hive副本。CLI是和Hive交互的最简单也是最常用方式,只需要在一个具备完整Hive环境下的Shell终端中键入hive即可启动服务。 用户可以在CLI上输入HQL来执行创建表、更改属性以及查询等操作。不过Hive CLI不适应于高并发的生产环境,仅仅是Hive管理员的好工具。
2、JDBC/ODBC: JDBC是java database connection的规范,它定义了一系列java访问各类db的访问接口,因此hive-jdbc其实本质上是扮演一个协议转换的角色,把jdbc的标准协议转换为访问HiveServer服务的协议。hive-jdbc除了扮演网络协议转化的工作,并不承担他的工作,比如sql的合法性校验和解析,一律忽略 。ODBC是一组对数据库访问的标准AP ,它的底层实现源码是采用C/C++编写的。JDBC/ODBC都是通过hiveclient与hiveserver保持通讯的,借助thrfit rpc协议来实现交互。
3、HWI:HWI是Hive的web方为接口,提供了一种可以可以通过浏览器来访问Hive的服务。
服务端组件
1、Thrift Server:Thrift是facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,hive集成了Thrift Server服务,能让不同的编程语言调用hive的接口。
2、元数据(Metastore):
元数据服务组件,这个组件用于存储hive的元数据, 包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。hive的元数据存储在关系数据库里,支持derby、mysql两种关系型数据库。元数据对于hive十分重要,因此hive支持把metastore服务独立出来,安装到远程的服务器集群里,从而解耦hive服务和metastore服务,保证hive运行的健壮性。
3、Driver组件:
该组件包括Interpreter、Complier、Optimizer和Executor,它的作用是将我们写的HiveQL(类SQL)语句进行解析、编译、优化,生成执行计划,然后调用底层的mapreduce计算框架。
解释器:将SQL字符串转化为抽象语法树AST
编译器:将AST编译成逻辑执行计划;
优化器:对逻辑执行计划进行优化;
执行器:将逻辑执行计划转成可执行的物理计划,如MR/Spark
- 1
- 2
- 3
- 4
总结##
对于数据存储,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。