之前有操作过HBase和Hive的案例,将30w条数据从Hive导入HBase。使用sqoop可以快速简单做到,但是在最新版HBase2.0与最新版Hive3.0之间,旧版sqoop不行,因此当时使用了JDBC来连接两者,达到数据导出的目的。
HBase与Hive的对比
Hive
- 作为数据仓库,Hive的本质是将HDFS已经存储的文件在MySQL中做了一个双射关系,以方便使用HiveQL管理查询
- 用于数据分析、清洗,Hive适用于离线的数据分析和清洗
HBase
- 数据库,面向列族存储的非关系型数据库
- 用于存储结构化和非结构化的数据,不适合做关联查询,join
- 延迟较低,高效的数据访问
集成使用
案例一
建立Hive表,关联HBase表,插入数据到Hive表的同时能够影响HBase表
在Hive中创建表同时关联HBase
CREATE TABLE hive_hbase_emp_table(
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_emp_table");
创建完,HBase也会出现此表
在Hive中创建临时中间表,用于load文件中的数据
CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by ' ';
不能将数据直接load到Hive关联HBase的表中,因此要创建中间表
向Hive中间表中load数据
hive> load data local inpath '/home/admin/softwares/data/emp.txt'
into table emp;
通过insert命令将中间表中的数据导入Hive关联HBase的表中
INSERT INTO TABLE hive_hbase_emp_table
SELECT * FROM emp;
此时Hive和HBase两张表都插入了数据
总结
Hive可以直接创建表关联到HBase,用中间表导入数据后插入关联表。
案例二
在HBase中已经存储了一张表hbase_emp_table,在Hive中创建关联表,就可以使用Hive来分析HBase数据
CREATE EXTERNAL TABLE relevance_hbase_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:co
mm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
总结
这样就不需要通过JavaAPI读取HBase数据,然后编程做MapReduce程序处理业务逻辑,可直接通过Hive,效率提高了。遇到部分特殊情况,估计还是得通过JavaAPI。