HBase与Hive集成
一 Hive与HBase集成使用场景
-
将HBase作为Hive数据源
- 让HBase支持类SQL操作
- 让HBase支持类SQL操作
-
将Hive ETL数据存入HBase
- 便于快速查询
- 便于快速查询
-
构建低延时的数据仓库
- 利用HBase快速读写能力
- 实现数据实时查询
二 Hive与HBase集成原理
- 通过两者本身对外的API接口互相通信完成
- 由Hive的lib目录中hive-hbase-handler-*.jar工具类实现
- HBaseStorageHandler
- 实现Hive与HBase集成的类
- 对HiveStorageHandler接口的实现
三 HBase与Hive集成
首先我们查看一下Hbase中表emp_basic
的列簇和字段名
根据上述信息在Hive里编写一个对应的外部表
当Hbase中表已存在时,要在Hive中创建外部表但不指定location去映射Hbase,此时该外部表不存储数据,有点类似于视图,在Hive中的插入数据会储存到Hbase目录下。而当Hbase不存在表时,只需要将下方命令去掉external变为内部表即可,执行完命令后,hive和hbase都会创建好表,数据同样存在hbase中。
注:在default数据下,无论是内部表还是外部表,都会在hdfs/home/hadoop/hive/warehouse
路径下创建表名目录,区别是内部表实际数据储存到表名目录下可删除,外部表实际数据储存到指定location下删表时删不掉(当然不指定也存到表名目录下,可是删除还是删不掉)。当然它们的元数据都存储在mysql里。
-- 在hive中创建外部表
create external table emp_basic(
emp_id string,
emp_name string,
company string,
job_title string,
start_date string,
end_date string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties
('hbase.columns.mapping'=':key,emp:name,emp:company,emp:job_title,time:sDate,time:eDate')
tblproperties('hbase.table.name'='emp_basic');
- 在Hive中查询
select * from emp_basic
在Hive中插入数据,通过HBase查询
- 在Hive中插入数据(Hive只支持select和insert)
insert into emp_basic values(1111,'hah','lla','gaga','2020-03-01','2020-09-25');
- 在Hbase中查询Hive插入的数据
get 'emp_basic','1111'
在Hbase中插入数据,在Hive中查询
- 在Hbase插入数据
--在Hbase中插入数据
put 'emp_basic','1111','emp:company','hello'
put 'emp_basic','1111','emp:job_title','dajia'
put 'emp_basic','1111','emp:name','hao'
put 'emp_basic','1111','time:sDate','2020-01-01'
put 'emp_basic','1111','time:eDate','2020-11-11'
--在Hbase中查询
get 'emp_basic','1111'
- 在Hive中查询
select * from emp_basic where emp_id='1111';