对于hbase 与 hive的集成,主要就是依靠两者的API接口进行相互通讯,我们直接来看,主要的两种方式,个人觉得这种功能在实际工作,应该运用的比较少
一、将hive中存在的表映射到hbase中(集成操作都是在hive中进行的)
1、首先我们hive中存在一张有数据的表hbase_hive_empinfo 至于为什么要存在这样一张表后面会说到,
2、我们在hive中来创建一张和hbase有映射关系的表,同是也会在hbase中将这张表创建出来
CREATE TABLE hive_emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_hive:hive_emp");
"hbase.table.name" = "hbase_hive:hive_emp" -->这是在hbase中的表的表名
hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno
-->这是表对应的列 默认hive的第一列 映射为hbase表的rowkey
我们来看看创建好的表 ,如下图所示,hbase中的表已经存在了
接下来我们对hive中的表进行数据插入,这时我们要注意,这里不能采用load的方式从文件系统加载数据到hive表中,这个方式是不行的,所以我们提前有一张有数据的表,来对我们的表进行数据插入
insert into table hive_emp select * from hbase_hive_empinfo; 用这种方式对数据进行插入
插入成功之后我们来看看两张表的数据
hive中
hbase中
可以看到两个表都有数据了,可是真正的数据到底存在哪里呢
hbase中的region中是存在数据的,手动flush
再看看hive中,是不存在数据的
这就说明我们第一种映射的数据是存在hbase的region中的,但而且hive表的数据更新,也会同是反映到hbase的表中,比如我们在插入一条数据,麻烦直接插入的同样的数据,
这是之前的
这是hive执行插入数据后的
可以看到 时间戳已经变成最新的了,所以一旦关系建立,可以通过hive来对Hbase的表数据进行更新
二、hbase中已存在的表,将其映射到hive中,
已存在的表 hbase.table.name" = "hbase_hive:emp_info
hive中新建的映射表 hbase_hive_empinfo
create external table hbase_hive_empinfo(
Y1 string,
y2 string,
Y3 string,
Y4 string,
y5 date,
Y6 int,
y7 int,
Y8 string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:Y1,info:Y2,info:Y3,info:Y4,info:Y5,info:Y6,info:Y7")
TBLPROPERTIES ("hbase.table.name" = "hbase_hive:emp_info");
这个就很简单了,就可在hive中进行数据的聚合,分析查询,
有两个注意:
1.如果是hive映射到habse
删除hive中的表,对应hhbase中的会一起被删除
2.如是hbase映射hive
删除hive中的表,是不会影响hbase中的表,这种情况意味着只是hive在habse对应的表中做了一个映射关系而已