hive就是MapReduce的封装
hbase是hdfs的包装,本质是部署在hdfs上的数据库克服随机读写的缺点
Hive是基于一个统一的查询分析层,通过sql语句对HDFS上的数据进行查询统计和分析,hive本身并不能存数据。
它是一个SQL解析引擎,将SQL转译成MR Job之后在Hadoop平台上运行,达到快速开发的目的,是纯逻辑表没有物理存储,不支持数据的修改和删除(在0.14版本后可以更新,但是默认不支持)
hive要制定三个属性
行分隔符(空格、\t、\001)
列分隔符(\n)
读取文件方法:TextFile(磁盘开销大)、SequenceFile(二进制)、RCFile(hive专门推出的面向列的数列格式)
SequenceFlie是Hadoop提供的一种二进制文件,通常是以(key,value)的形式数列化到文件中
Java里有writeable接口进行序列化和反序列化
select word,count(*)
from (
select
explode(split(sentence, ' '))
word
from article
) t
group by word
这段代码就用hive实现了wordcount
split(sentence,' ')这个把读进来的每一个字符串都转换成了一个数组用' '分割
explode 是展开用的输入一行转成多个行(读入一个数组转成一条记录供外部使用)
这几个都是函数,但是有不同
UDF:直接应用于select语句(查询的时候对字段进行格式化处理,如大小写转换)
特点:一进一出,一对一
UDAF:
多对一的场景
运用于group by的场景
UDTF:一对多
读时模式:
只有在读的时候才检查、解析字段、schema(据库的组织和结构)
加载数据写数据快
传统数据库写的慢,读的时候会得到优化
Hive的组织结构
driver相当于把sql(hql)变成一个或多个MapReduce是核心部分, 自身不会生成mr会通过一个执行计划执行mr。
默认的本地数据库是derby(单用户)
一般多用户远程服务模式:MySQL
hive有四个数据类型
数据表:
table
external table
分区表:
partition
bucket
每一个table都有一个目录存储数据,一个表可以有多个分区,一个table可以有多个partition
也不能创建太多分区,只适合取值有限的否则会产生很多小文件,工作中常见的是拿时间、地域、系统分区
分桶(bucket)
table -> partition -> bucket(partitionx目录下的part
table -> bucket
分库,把一张表拆成多个表
例如分32个 user_id % 32
tableOnlineBroadcast_0
tableOnlineBroadcast_1
....
tableOnlineBroadcast_31
可以通过这种方式把两个大表之间的join和两个小表之间的join
两个优点
1.优化查询
2.方便采样
内部表和外部表之间的差别
如果drop的是内部表,内部表里的数据也会丢失,外部表则只drop表结构不丢失数据
支持原生类型和复合类型