首页 > 大数据 > Hadoop > 大数据开发之离线分析工具Hive
Hive是Facebook为了解决海量日志数据的分析而开发的,后来开源给了Apache软件基金会,可见Apache软件基金会是个神奇的组织, 我们之前学过的很多开源工具都有Apache软件基金会的身影。
官网定义:
The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.
此处版本是Hive-1.0.0
Hive的几个特点
Hive的核心
Hive的核心是驱动引擎,驱动引擎由四部分组成:
Hive的底层存储
Hive的数据是存储在HDFS上的,Hive中的库和表可以看做是对HDFS上的数据做的一个映射。所以HVIE必须运行在一个Hadoop的集群上的
Hive语句执行过程
Hive中的执行器,是将最终要执行的MapReduce程序放到YARN上以一系列Job的方式去执行。
Hive的元数据存储
Hive的元数据是一般是存储在MySQL这种关系型数据库上的,Hive和MySQL之间通过MetaStore服务交互。
Hive有很多种客户端。
基本的数据类型
DDL语法
创建数据库
创建一个数据库会在HDFS上创建一个目录,Hive里数据库的概念类似于程序中的命名空间,用数据库来组织表, 在大量Hive的情况下,用数据库来分开可以避免表名冲突。Hive默认的数据库是default。
创建数据库例子:
查看数据库定义
user_db是数据库名
hdfs://bigdata-51cdh.chybinmy.com:8020/user/hive/warehouse/userdb.db 是userdb库对应的存储数据的HDFS上的根目录。
查看数据库列表
创建数据库
创建分区表
Hive查询一般是扫描整个目录,但是有时候我们关心的数据【关注尚硅谷,轻松学IT】只是集中在某一部分数据上,比如我们一个Hive查询,往往是只是查询某一天的数据,这样的情况下,可以使用分区表来优化,一天是一个分区,查询时候,Hive只扫描指定天分区的数据。
普通表和分区表的区别在于:一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。
这个例子中,这个日志表以dt字段分区,dt是个虚拟的字段,dt下并不存储数据,而是用来分区的,实际数据存储时,dt字段值相同的数据存入同一个子目录中,插入数据或者导入数据时,同一天的数据dt字段赋值一样,这样就实现了数据按dt日期分区存储。
当Hive查询数据时,如果指定了dt筛选条件,那么只需要到对应的分区下去检索数据即可,大大提高了效率。所以对于分区表查询时,尽量添加上分区字段的筛选条件。
创建桶表
桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。举例:
对这个例子的说明:
clustered by是指根据userid的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同userid的数据放入同一个桶中。而经销商的订单数据,大部分是根据user_id进行查询的。这样大部分情况下是只需要查询一个桶中的数据就可以了。
sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在join操作时能获得很高的效率。
into 10 buckets是指定一共分10个桶。
在HDFS上存储时,一个桶存入一个文件中,这样根据user_id进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。
文章来源:极客运维之家
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010293/viewspace-2852038/ ,如需转载,请注明出处,否则将追究法律责任。