特点
- 可扩展:可以自由的扩展集群的规模,一般情况下不需要重启服务
- 延展性:Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数
- 容错良好的容错性,节点出现问题SQL仍然可以完成执行
- 弱事务的:因为要处理海量的数据,所有可以有小的错误。
元数据
存储: Hive将元数据存储在元数据库中(mysql/derby).
**内容:**元数据包括表的名字、表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在的目录。
Hive与Hadoop的关系
Derby元数据库
hive默认使用自带的Derby数据库来存储元数据,当在bin目录下进入hive时,derby数据库会在bin目录下生成一个metastore_db目录,将元数据信息存在这个目录下。
而当我们换一个目录启动hive的时候,derby数据库又会在当前目录生成一个metastore_db目录,存储元数据,这种情况会导致上次hive中的元数据丢失。
内部表
先有Hive表,再有数据
特点:当内部表被删除的时候,hive中该表的元数据和对应的文件也会被删除掉
create table t1(id int,name string)row format delimited fields terminated by ‘,’;
load data local inpath ‘/home/software/1.txt’ into table t1;
外部表
先有文件,里面存储了数据,通过hive创建一张表来管理这个文件数据,在建表的同时指定一个指向实际数据的路径(LOCATION),这样的表称之为外部表
特点:删除外部表的时候,只是删除hive中这个表的元数据,而不会删除外部文件
create external table s(id int,name string) row format delimited fields terminated by ‘,’ location ‘hdfs://192.168.1.111:90000/hive/my’;
分区表
内部表和外部表都可以是分区表。
**概念:**对数据按照某列或者某些列进行分区管理。
例:当前互联网应用每天都要存储大量的日志文件,几G、几十G甚至更大都是有可能。存储日志,其中必然有个属性是日志产生的日期。在产生分区时,就可以按照日志产生的日期列进行划分。把每一天的日志当作一个分区。
**作用:**可以避免查询整表,在生产环境下基本都是建立带有分区字段的表。
实现细节:
- 一个表可以拥有一个或者多个分区,每个分区以文件夹的形式在表文件夹的目录下
- 表和列名不区分大小写
- 分区是以字段的形式在表结构中存在,但是在建表的时候不能在字段中,不存储实际的数据内容。
语法:
- 创建分区表:create table bok(id int,name string) partitioned by(category string) row format delimited fields terminated by ‘\t’
- 分区表加载数据:load data locak inpath ‘/home/cn.txt’ insert into table book partation(category=‘cn’);
- 从一个分区中查询数据:select * from book where category=‘cn’
分桶表
概念: 对于每一个表或者分区,Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织,采用对列值哈希,然后除以桶的个数求余的方式决定该条记录放在哪个桶当中。
开启分桶机制: set hive.enforce.bucketing=true;
语法:
创建分桶表:create table teacher(name string) clustered by (name) into 3 buckets row format delimited fields terminated by ’ ';
.往表中插入数据:insert overwrite table teacher select * from tmp;
**注意:**对于分桶表不允许以外部文件方式导入数据,只能从另外一张表导入数据,分桶表只能是内部表
Hive的UDF
实现步骤:
- 新建一个java工程,导入hive相关的包
- 创建类继承UDF
- 自己编写一个evaluate方法,返回值和参数任意。自己编写一个evaluate方法,返回值和参数任意。