Hive原理总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值