前面讲了一些数据仓库的安装和DDL的基本使用以及hive的简单架构,只要你熟悉基本的sql,就能够进行基本的hive数据分析。
当然,我们还是得区分一般传统数据库和hive,毕竟sql不能完全适用hive,一些基础知识还是要掌握的。
内部表和外部表
我们常用的表一般就是内部表(inner),它时hive默认创建的表,它的元数据存储在了数据库里面,实际的数据以某种格式存储在了hdfs,这里的某种格式等下会说。
但是外部表就不同了,它的由来主要时想某一个表可以共享数据使用,而且它的实际数据不是存储在hdfs的hive默认存储目录,而是在创建表时自己定义的目录。
还有要记住的就是在删除表时,一定要知道删除内部表时元数据和hdfs的实际数据都被删除了,而外部表知识将元数据删除,实际的数据仍然在hdfs上。
而在做数据迁移的时候,一般迁移就是类似于剪切的操作,然后改变一下元数据的映射关系。
分区表和分桶表
分区表
这个东东也很常见,当数据量很大时,我们可能会通过分区的方式,可以让数据查询更加方便,性能提高。
create table table1(
id int,
name string)
row format delimited
fields terminited by ','
partitioned by (data string,hour string);
比如创建上面这个分区表,我们针对数据的特点,根据日期,小时进行分区,这里官方在某种程度上可能把日期也当作这个分区表的字段,但是不是实际表的字段,实际字段还是自己创建的,只不过在查询的时候被用来分区的字段可以当作字段来使用。而且分区字段在hdfs上面是以目录形式层层递进的,而不是在一个文件中以字段形式表现。
比如
这里再table1表下面会有data目录,data目录下面又有hour目录,然后才是对应的data和hour分区的表信息。
分桶表
分桶表在分区表上更细粒度,它时基于对文件的管理,我们刚才看分区表是基于字段的文件夹,只要新建一个分区就有一个文件夹,那么对于分桶,就是对一个文件里面的数据进行hash,当然是根据某一个字段进行hash,如果是int就对桶的个数取模,如果是string,就是对字段进行hash,分成桶的个数,每个桶对应一个hdfs的文件,也就是一个reduce,后续进行reduce操作,都是直接对每个文件进行reduce。
先创建一个中间表
create table test(uid int,name string,age int) row format delimited fields terminated by ',';
将数据导入到这个中间表里面
load data local inpath '/home/hadoop/t1' into table test;
创建分桶表:
create table bucket(
id int,
name string,
age int)
clustered by (id) sorted by (age) row format delimited fields terminated by ',';
然后将中间表test的内容插入到分桶表里面
from test
insert into table bucket
select *;
对应的三个分桶就有了三个文件,文件里面是根据id取模分桶的。
需要注意的是,如果是2.x的hive版本倒是没什么问题,如果是1.x就有问题了,导入的表可能还是要给分桶,原因是需要设置参数
set hive.enforce.bucketing =
true
;强制使用分桶。
我们可以看一下数据
39-6为一个桶,58-1为一个桶,2-8为一个桶。
我们来对分桶的数据进行抽样,使用的是tablesample
注意tablesample(x out of y )
x:是要看第几个桶
y:是取桶/y的数据。比如有4个桶,y是8,那么就取一般的数据。
hive表在hdfs存储格式
TEXTFILE格式
这是hive默认的存储格式,除非在配置文件中配置hive.default.fileformat配置默认的其他格式,就可以了。
TEXTFILE也是利用分隔符来读取分隔符文件的。
SEQUENCEFILE
以序列化的方式存储
它是hadoop API提供的一种二进制文件支持,比较方便,可分割,可压缩
有NONE,RECORD,BLOCK三种压缩选择。一般使用BLOCK
RCFILE
一种以行列存储结合的存储方式
Parquet
一种行式存储,同时具有很好的压缩性能;可以减少大量的表扫描和反序列化时间。
ORCFile
数据按照行分块,每个块按照列存储,其中每个块都存储有一个索引。hive给出的新格式,属于RCFILE的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快 快速列存取。
支持ACID事务,和优化。