[size=large][b]Hive 是什么[/b][/size]
[color=red][b]Hive是建立在Hadoop上的数据仓库基础构架。[/b][/color]它提供了一系列的工具,[color=red][b]可以用来进行数据提取转化加载(ETL)[/b][/color],[color=blue][b]这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。[/b][/color]Hive 定义了简单的类SQL 查询语言,[b]称为 QL,它允许熟悉 SQL 的用户查询数据[/b]。同时,[b]这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。[/b]
Hive没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。
[color=red][b]Hive中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。Hive中你添加了数据就无法删除的,SQL的fans们是不是很费解?[/b][/color]
[size=x-large][color=red][b]1 Hive的体系结构划分[/b][/color][/size]
[color=blue][b]下面是Hive的架构图: [/b][/color]
[img]http://dl2.iteye.com/upload/attachment/0124/1501/2d651ff8-8625-3af2-9aba-0fa298ada924.gif[/img]
[color=red][b]1. 用户接口主要有三个:CLI,Client 和 WUI。[/b][/color]其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。[b]Client是Hive的客户端,用户连接至Hive Server。[/b]在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
[color=blue][b]2. Hive将元数据存储在数据库中[/b][/color],如MySQL、derby。Hive中的[color=red][b]元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 [/b][/color]
[b]3. 解释器、编译器、优化器完成HQL查询语句[/b]从词法分析、语法分析、编译、优化以及查询计划的生成。[color=red][b]生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行。[/b][/color]
[size=medium][b]4. Hive的数据存储在HDFS中[/b][/size]。在hive中运行“select * from example_table”时直接返回当前所有值,[color=blue][b]并不会启动mapreduce任务,而当构建一些复杂的特殊的HQL语句时,就会启动一个mapreduce任务来进行处理。[/b][/color]
[size=large][b]2 Hive的数据模型[/b][/size]
对于数据存储,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,[color=red][b]只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。[/b][/color]
[color=blue][b]Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。[/b][/color]
[color=red][b]Hive中包含以下数据模型:Table内部表,External Table外部表,Partition分区,Bucket桶。[/b][/color]Hive默认可以直接加载文本文件,还支持sequence file 、RCFile。
[size=medium][b]3.1 Hive数据库[/b][/size]
类似传统数据库的DataBase,在第三方数据库里实际是一张表。简单示例命令行
hive > create database test_database;
[size=medium][b]3.2 内部表(一个文件只能对应一个内部表)
[/b][/size]
[color=red][b]Hive的内部表与数据库中的Table在概念上是类似。每一个Table在Hive中都有一个相应的目录存储数据。[/b][/color]例如一个表pvs,它在HDFS中的路径为/wh/pvs,[b]其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的数据仓库的目录,[/b]所有的Table数据(不包括External Table)都保存在这个目录中。[color=red][b]删除表时,元数据与数据都会被删除。[/b][/color]
[color=darkred][b]内部表简单示例:[/b][/color]
创建数据文件:test_inner_table.txt
创建表:create table test_inner_table (key string)
加载数据:LOAD DATA LOCAL INPATH 'filepath' INTO TABLE test_inner_table
查看数据:select * from test_inner_table;
select count(*) from test_inner_table;
删除表:drop table test_inner_table
[size=medium][b]3.3 外部表[/b][/size]
[color=red][b]外部表指向已经在HDFS中存在的数据,可以创建Partition。[/b][/color]它和内部表在元数据的组织上是相同的,而实际数据的存储则有较大的差异。[color=red][b]内部表的创建过程和数据加载过程这两个过程可以分别独立完成,也可以在同一个语句中完成,在加载数据的过程中,实际数据会被移动到数据仓库目录中;[/b][/color]之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。而外部表只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),[color=blue][b]实际数据是存储在LOCATION后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。[/b][/color][b]当删除一个External Table时,仅删除该链接。[/b]
外部表简单示例:
创建数据文件:test_external_table.txt
创建表:create external table test_external_table (key string)
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_inner_table
查看数据:select * from test_external_table;
select count(*) from test_external_table
删除表:drop table test_external_table
[size=medium][b]3.4 分区[/b][/size]
Partition对应于数据库中的Partition列的密集索引,但是Hive中Partition的组织方式和数据库中的很不相同。[color=red][b]在Hive中,表中的一个Partition对应于表下的一个目录,所有的Partition的数据都存储在对应的目录中。[/b][/color]
例如pvs表中包含ds和city两个Partition,则对应于ds = 20090801, ctry = US 的HDFS子目录为/wh/pvs/ds=20090801/ctry=US;对应于 ds = 20090801, ctry = CA 的HDFS子目录为/wh/pvs/ds=20090801/ctry=CA。
分区表简单示例:
创建数据文件:test_partition_table.txt
创建表:create table test_partition_table (key string) partitioned by (dt string)
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_partition_table partition (dt='2006')
查看数据:select * from test_partition_table; select count(*) from test_partition_table
删除表:drop table test_partition_table
[size=medium][b]3.5 桶[/b][/size]
[color=red][b]Buckets是将表的列通过Hash算法进一步分解成不同的文件存储。[/b][/color]它对指定列计算hash,根据hash值切分数据,目的是为了并行,[b]每一个Bucket对应一个文件。[/b]
例如将user列分散至32个bucket,首先对user列的值计算hash,对应hash值为0的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00000;hash值为20的HDFS目录为/wh/pvs/ds=20090801/ctry=US/part-00020。如果想应用很多的Map任务这样是不错的选择。
桶的简单示例:
创建数据文件:test_bucket_table.txt
创建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets
加载数据:LOAD DATA INPATH 'filepath' INTO TABLE test_bucket_table
查看数据:select * from test_bucket_table;
set hive.enforce.bucketing = true;
[size=medium][b]3.6 Hive的视图
[/b][/size]
视图与传统数据库的视图类似。[color=red][b]视图是只读的,它基于的基本表[/b][/color],如果改变,数据增加不会影响视图的呈现;如果删除,会出现问题。
如果不指定视图的列,会根据select语句后的生成。
示例:
create view test_view as select * from test
转自:[url]http://blog.csdn.net/lnho2015/article/details/51383717[/url]