Facebook为了解决海量日志数据的分析而开发了Hive,后来开源给了Apache软件基金会。
Hive是一种用类SQL语句来协助读写、管理那些存储在分布式存储系统上大数据集的数据仓库软件。
Hive最大的特点是通过类SQL来分析大数据,而避免了写MapReduce程序来分析数据,这样使得分析数据更容易。
数据是存储在HDFS上的,Hive本身并不提供数据的存储功能
Hive是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如MySQL)。
数据存储方面:它能够存储很大的数据集,并且对数据完整性、格式要求并不严格。
数据处理方面:因为Hive语句最终会生成MapReduce任务去计算,所以不适用于实时计算的场景,它适用于离线分析。
Hive的数据是存储在HDFS上的。Hive中的库和表可以看作是对HDFS上数据做的一个映射。所以Hive必须是运行在一个Hadoop集群上的。
Hive中的执行器,是将最终要执行的MapReduce程序放到YARN上以一系列Job的方式去执行。
Hive的元数据是一般是存储在MySQL这种关系型数据库上的,Hive和MySQL之间通过MetaStore服务交互。
clustered by是指根据user_id的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同user_id的数据放入同一个桶中。
sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在join操作时能获得很高的效率。
into 10 buckets是指定一共分10个桶。
在HDFS上存储时,一个桶存入一个文件中,这样根据user_id进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。
hive文件存储格式包括以下几类:
其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理;SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接从本地文件导入数据,数据要先导入到textfile格式的表中, 然后再从表中用insert导入SequenceFile,RCFile,ORCFile表中。
首先我们看一下一张表的存储格式
Field A | Field B | Field C |
---|---|---|
A1 | B1 | C1 |
A2 | B2 | C2 |
A3 | B3 | C3 |
A4 | B4 | C4 |
A5 | B5 | C5 |
行式存储
- | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1 | B1 | C1 | A2 | B2 | C2 | A3 | B3 | C3 | A4 | B4 | C4 | A5 | B5 | C5 |
列式存储
- | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A1 | A2 | A3 | A4 | A5 | B1 | B2 | B3 | B4 | B5 | C1 | C2 | C3 | C4 | C5 |
行式存储
相关的数据是保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录 这种存储格式比较方便进行INSERT/UPDATE操作
如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取。当然数据比较少,一般没啥问题,如果数据量比较大就比较影响性能 由于每一行中,列的数据类型不一致,导致不容易获得一个极高的压缩比,也就是空间利用率不高 不是所有的列都适合作为索引
查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询 高效的压缩率,不仅节省储存空间也节省计算内存和CPU 任何列都可以作为索引
INSERT/UPDATE很麻烦或者不方便 不适合扫描小量的数据
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。
可结合Gzip、Bzip2使用(系统自动检查,执行查询时自动解压),但使用这种方式,hive不会对数据进行切分,从而无法对数据进行并行操作。
SequenceFile是Hadoop API提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。
SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,一般建议使用BLOCK压缩。
RCFILE是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。其次,块数据列式存储,有利于数据压缩和快速的列存取。
ORCFile存储格式,就是Optimized RC File的缩写。意指优化的RCFile存储格式。
Serde是 Serializer/Deserializer的简写。hive使用Serde进行行对象的序列与反序列化。
你可以创建表时使用用户自定义的Serde或者native Serde,如果 ROW FORMAT没有指定或者指定了 ROW FORMAT DELIMITED就会使用native Serde。
hive已经实现了许多自定义的Serde,之前我们在介绍stored时也涉及到:
和我们熟悉的关系型数据库不一样,Hive现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。
load data local inpath 'xxx.txt' into table xxx;
load data inpath '/home/xxx/add.txt' into table xxx
alter table db.access_log add partition (dt='18-09-18') location 'hdfs://ns/hive/warehouse/access_log/dt=18-09-18';
insert overwrite table db.log_v2 partition(dt='18-09-26') select uid,model,key,value,time from db.log where dt='18-09-26';
create table test4 as select id, name, tel from xxx;