Hive知识点整理
1、hive 1.x的版本的hql数据处理是转化为mapreduce程序实现的,而hive 2.x是基于spark来实现。
2、hive将表结构信息(元数据)存储在mysql中,而实际的数据信息存储在hdfs中。数据库中的一个表对应hdfs中的一个目录,所以在查询的时候会将hdfs中的数据解析后按照表规定的格式显示出来。
3、hive只支持对数据的查询操作(不包括对表的删除的话),而不具备mysql数据库的增、删、改操作, 所以在我的概念里,hive不能称之为一个数据库,只能称之为一个数据分析工具。
4、hive分区与桶的理解。
hive分区其实就是在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读取数据的范围。分区其实际表现为表中的一个字段,如通过select count(*) from t_access where dt='20170804';可以查询20170804分区目录中的文件的个数。
桶就是表(或分区)目录里的一个文件,分桶是相对分区进行更细粒度的划分。分桶将整个数据内容按照某列属性值的hash值进行区分,如要安装name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件。实际上,桶对应于mapreduce的输出文件分区,一个作业产生的桶(输出文件)和reduce任务个数相同。
与分区不同的是,分区依据的不是真实数据表文件中的列,而是我们指定的伪列,但是分桶是依据数据表中真实的列而不是伪列。所以在指定分区依据的列的时候要指定列的类型,因为在数据表文件中不存在这个列,相当于新建一个列。而分桶依据的是表中已经存在的列,这个列的数据类型显然是已知的,所以不需要指定列的类型。
分桶存在的意义:(1)获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
(2)使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
5、最常用的保存hive查询结果的方法是hive -e "select user, login_timestamp from user_login" > /tmp/out.txt
问题
1、存储格式的问题,无论是mapreduce中还是hive中,均提到了文件有的不同格式,hadoop生态体系中文件到底可以分为哪几种格式?他们分别是怎么产生的?又该如何处理?他们又有什么特点?见P494。
2、hive的底层实现是通过mapreduce来实现的,那么结果是否也是存储在hdfs中呢?是否每一次的查询结果都会有保存?桶中的数据是如何得到的?
解:可以通过两种方式将数据注入桶中:(1)从hdfs或本地磁盘中load数据,导入中间表;(2)通过从中间表查询的方式的完成数据导入。(未完待续)
参考链接
1. https://blog.csdn.net/knidly/article/details/80285284
2. https://blog.csdn.net/u010003835/article/details/80911215