赞
踩
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。
创建数据库例子:
hive> create database if not exists user_db;
查看数据库定义
- hive> describe database user_db;
- OK
- user_db hdfs://bigdata-51cdh.chybinmy.com:8020/user/hive/warehouse/user_db.db hadoop USER
user_db是数据库名
hdfs://bigdata-51cdh.chybinmy.com:8020/user/hive/warehouse/userdb.db 是userdb库对应的存储数据的HDFS上的根目录。
查看数据库列表
- hive> show databases;
- OK
- user_db
- default
创建数据库
- hive> create table if not exists userinfo
- > (
- > userid int,
- > username string,
- > cityid int,
- > createtime date
- > )
- > row format delimited fields terminated by '\t'
- > stored as textfile;
- OK
- Time taken: 2.133 seconds
创建分区表
Hive查询一般是扫描整个目录,但是有时候我们关心的数据只是集中在某一部分数据上,比如我们一个Hive查询,往往是只是查询某一天的数据,这样的情况下,可以使用分区表来优化,一天是一个分区,查询时候,Hive只扫描指定天分区的数据。
普通表和分区表的区别在于:一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。
- create table user_action_log
- (
- companyId INT comment '公司ID',
- userid INT comment '销售ID',
- originalstring STRING comment 'url',
- host STRING comment 'host',
- absolutepath STRING comment '绝对路径',
- query STRING comment '参数串',
- refurl STRING comment '来源url',
- clientip STRING comment '客户端Ip',
- cookiemd5 STRING comment 'cookiemd5',
- timestamp STRING comment '访问时间戳'
- )
- partitioned by (dt string)
- row format delimited fields terminated by ','
- stored as textfile;
这个例子中,这个日志表以dt字段分区,dt是个虚拟的字段,dt下并不存储数据,而是用来分区的,实际数据存储时,dt字段值相同的数据存入同一个子目录中,插入数据或者导入数据时,同一天的数据dt字段赋值一样,这样就实现了数据按dt日期分区存储。
当Hive查询数据时,如果指定了dt筛选条件,那么只需要到对应的分区下去检索数据即可,大大提高了效率。所以对于分区表查询时,尽量添加上分区字段的筛选条件。
创建桶表
桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。举例:
- create table user_leads
- (
- leads_id string,
- user_id string,
- user_id string,
- user_phone string,
- user_name string,
- create_time string
- )
- clustered by (user_id) sorted by(leads_id) into 10 buckets
- row format delimited fields terminated by '\t'
- stored as textfile;
对这个例子的说明:
clustered by是指根据userid的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同userid的数据放入同一个桶中。而经销商的订单数据,大部分是根据user_id进行查询的。这样大部分情况下是只需要查询一个桶中的数据就可以了。
sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在join操作时能获得很高的效率。
into 10 buckets是指定一共分10个桶。
在HDFS上存储时,一个桶存入一个文件中,这样根据user_id进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。
文章来源:极客运维之家
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。