1、 hive有哪些保存元数据的方式,各有什么特点。
内存数据库derby,安装小,但是数据存在内存,不稳定
mysql数据库,数据存储模式可以自己设置,持久化好,查看方便。
2、 Hive内部表外部表区别及各自使用场景
区别:
内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除
外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。
这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
使用场景:
(1)每天采集的nginx日志和埋点日志,在存储的时候建议使用外部表,因为日志数据是采集程序实时采集进来的,一旦被误删,恢复起来非常麻烦。而且外部表方便数据的共享。
(2)抽取过来的业务数据,其实用外部表或者内部表问题都不大,就算被误删,恢复起来也是很快的,如果需要对数据内容和元数据进行紧凑的管理, 那还是建议使用内部表
(3)在做统计分析时候用到的中间表,结果表可以使用内部表,因为这些数据不需要共享,使用内部表更为合适。并且很多时候结果分区表我们只需要保留最近3天的数据,用外部表的时候删除分区时无法删除数据。
3、 简单描述一下HIVE的功能?用hive创建表有几种方式?hive表有几种?
hive主要是做离线分析的
hive建表有三种方式
直接建表法
查询建表法(通过AS 查询语句完成建表:将子查询的结果存在新表里,有数据,一般用于中间表)
Like建表法(会创建结构完全相同的表,但是没有数据)
hive表有2种:内部表和外部表
4、 分区分桶的区别,为什么要分区?
分区表:原来的一个大表存储的时候分成不同的数据目录进行存储。如果说是单分区表,那么在表的目录下就只有一级子目录,如果说是多分区表,那么在表的目录下有多少分区就有多少级子目录。不管是单分区表,还是多分区表,在表的目录下,和非最终分区目录下是不能直接存储数据文件的
分桶表:原理和hashpartitioner 一样,将hive中的一张表的数据进行归纳分类的时候,归纳分类规则就是hashpartitioner。(需要指定分桶字段,指定分成多少桶)
分区表和分桶的区别除了存储的格式不同外,最主要的是作用:
分区表:细化数据管理,缩小mapreduce程序 需要扫描的数据量。
分桶表:提高join查询的效率,在一份数据会被经常用来做连接查询的时候建立分桶,分桶字段就是连接字段;提高采样的效率。
有了分区为什么还要分桶?
(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利用这个结构。
(2)使取样( sampling)更高效。在处理大规模数据集时,在开发和修改査询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
分桶是相对分区进行更细粒度的划分。分桶将表或者分区的某列值进行hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。
5、 Hive 里边字段的分隔符用的什么?为什么用 ?有遇到过字段里 边有 的情况吗,怎么处理的?为什么不用 Hive 默认的分隔符,默认的分隔符是什么?
hive 默认的字段分隔符为 ascii 码的控制符 01(^A),建表的时候用 fields terminated by ' 01'。遇到过字段里边有 的情况,自定义 InputFormat,替换为其他分隔符再做后续处理。
6、 聊聊hive的执行引擎,spark和mr的区别?
引擎是mr,基于磁盘进行计算,比较慢
引擎是spark,基于内存进行计算,速度比较快
对于超大数据量的话,hiveOnSpark可能会有内存溢出情况
7、 hive的row_number中distribute by 和 partition by的区别
row_number() over( partition by 分组的字段 order by 排序的字段) as rank(rank 可随意定义表示排序的标识);
row_number() over( distribute by 分组的字段 sort by 排序的字段) as rank(rank 可随意定义表示排序的标识)
注意:
partition by 只能和order by 组合使用
distribute by 只能和 sort by 使用
8、hive中导入数据的4种方式
从本地导入:load data local inpath /home/liuzc into table ods.test
从hdfs导入:load data inpath /user/hive/warehouse/a.txt into ods.test
查询导入:create table tmp_test as select * from ods.test
查询结果导入:insert into table tmp.test select * from ods.test
9、 hive和传统数据库之间的区别
(1)、写时模式和读时模式
传统数据库是写时模式,在load过程中,提升了査询性能,因为预先解析之后可以对列建立索引,并压缩,但这样也会花费更多的加载时间。
Hive是读时模式,load data非常迅速,因为它不需要读取数据进行解析,仅仅进行文件的复制或者移动。
(2)、数据格式。Hive中没有定义专门的数据格式,由用户指定,需要指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法。数据库中,存储引擎定义了自己的数据格式。所有数据都会按照一定的组织存储
(3)、数据更新。Hive的内容是读多写少的,因此,不支持对数据的改写和删除,数据都在加载的时候中确定好的。数据库中的数据通常是需要经常进行修改
(4)、执行延迟。Hive在查询数据的时候,需要扫描整个表(或分区),因此延迟较高,只有在处理大数据是才有优势。数据库在处理小数据是执行延迟较低。
(5)、索引。Hive比较弱,不适合实时查询。数据库有。
(6)、执行。Hive是 Mapreduce,数据库是 Executor
(7)、可扩展性。Hive高,数据库低
(8)、数据规模。Hive大,数据库小
10、udf udaf udtf区别
UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。
UDTF 操作作用于单个数据行,并且产生多个数据行,一个表作为输出。lateral view explore()
简单来说:
UDF:返回对应值,一对一
UDAF:返回聚类值,多对一
UDTF:返回拆分值,一对多
11、Hive的执行流程?
(1)、用户提交查询等任务给Driver。
(2)、编译器获得该用户的任务Plan。
(3)、编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
(4)、编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。
(5)、将最终的计划提交给Driver。
(6)、Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。
(7)、获取执行的结果。
(8)、取得并返回执行结果。
12、sql语句的执行顺序
from-where-group by-having -select-order by -limit