Hive面试题_1_sql


文章目录

1.Hive的特点

hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的 sql 查询功能,可以将 sql 语句转换为MapReduce 任务进行运行。

其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析,但是 Hive 不支持实时查询。

一般实时的用flink+kafka,离线用hive+spark

hive的本质就是将sql转换为MapReduce的任务进行运算。
底层是由HDFS提供数据存储的。
Hive理解为sql转化为MapReduce的工具。

2.Hive与RDBMS对比

由于Hive采用了类似SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和传统的关系数据库除了拥有类似的查询语言,再无相似之处。

1.查询语言
HQL <=> SQL 高度相似

2.数据规模
Hive存储海量数据;RDBMS只能处理有限的数据集

3.执行引擎
Hive的引擎是MR/Tez/Spark/Flink;RDBMS使用自己的执行引擎

4.数据存储
Hive采用的是HDFS,RDBMS保存在本地磁盘

5.执行速度
Hive相对慢,RDBMS相对快

6.可扩展性
Hive支持水平扩展;RDBMS通常支持垂直扩展,对水平扩展不友好。

7.数据更新
Hive不友好,RDBMS更新频繁

3.Hive的优缺点

1.学习成本低
2.处理海量数据。底层基于MapReduce
3.系统可以水平扩展。底层基于Hadoop
4.功能扩展好,支持UDF
5.容错性好,某一个节点宕机了,HQL依然可以完成
6.统一的元数据管理

1.HQL表达能力有限
2.迭代计算无法表达
3.执行效率不高,因为是基于MR的引擎.impala效率高
4.Hive的调优困难

4.Hive的架构

Hive面试题_1_sql_02
CLI命令行 -> Hive(解释器 -> 编译器 -> 优化器 -> 执行器) -> Hadoop(yarn,hdfs)/Mysql

Hive的基本数据类型及转换

Hive面试题_1_sql_03

5.Hive 底层与数据库交互原理

由于 Hive 的元数据可能要面临不断地更新、修改和读取操作,所以它显然不适合使用 Hadoop 文件系统进行存储。

目前 Hive 将元数据存储在 RDBMS 中,比如存储在 MySQL、Derby 中。元数据信息包括:存在的表、表的列、权限和更多的其他信息。

6.Hive 的 HSQL 转换为 MapReduce 的过程

HiveSQL -> AST(抽象语法树) -> QB(查询块) -> OperatorTree(操作树)-> 优化后的操作树 -> mapreduce 任务树 -> 优化后的 mapreduce 任务树

  1. SQL Parser:Antlr 定义 SQL 的语法规则,完成 SQL 词法,语法解析,将 SQL 转化为抽象语法树 AST Tree;
  2. Semantic Analyzer:遍历 AST Tree,抽象出查询的基本组成单元 QueryBlock;
  3. Logical plan:遍历 QueryBlock,翻译为执行操作树 OperatorTree;
  4. Logical plan optimizer: 逻辑层优化器进行 OperatorTree 变换,合并不必要的 ReduceSinkOperator,减少 shuffle 数据量;
  5. Physical plan:遍历 OperatorTree,翻译为 MapReduce 任务;
  6. Logical plan optimizer:物理层优化器进行 MapReduce 任务的变换,生成最终的执行计划;

7.Hive 的两张表关联,使用 MapReduce 怎么实现

1.如果一张为小表,可以小表join大表聚合

2.如果两张都为大表,采用联合key,联合 key 的第一个组成部分是 join on 中的公共字段,第二部分是一个 flag,0 代表表 A,1 代表表 B。
由此让 Reduce 区分客户信息和订单信息;在 Mapper 中同时处理两张表的信息,将 join on 公共字段相同的数据划分到同一个分区中,进而传递到一个 Reduce 中,然后在 Reduce 中实现聚合。

8.hive 中 split、coalesce 及 collect_list 函数的用法

split 将字符串转化为数组,即:split(‘a,b,c,d’ , ‘,’) ==> [“a”,“b”,“c”,“d”]
coalesce(T v1, T v2, …) 返回参数中的第一个非空值;如果所有值都为 NULL,那么返回 NULL。
collect_list 列出该字段所有的值,不去重 => select collect_list(id) from table

9.Hive保存元数据方式

1.内嵌式元存储服务器 2.本地元存储服务器 3.远程元存储服务器

内嵌式元存储主要用于单元测试,每次只有一个线程连接元存储,Derby是内置的数据库
本地模式下,每个 Hive 客户端都会打开到数据存储的连接并在该连接上请求 SQL 查询
在远程模式下,所有的 Hive 客户端都将打开一个到元数据服务器的连接,该服务器依次查询元数据,元数据服务器和客户端之间使用 Thrift 协议通信 。