一、hbase为什么要集成hive:
HBase是一个NoSQL数据库!一般用作对海量大表数据的实时读写,不支持复杂的查询!
Hive是一个数据仓库软件!Hive主要用来对数据仓库中的数据进行分析!Hive支持使用HQL对表中的数据进行查询!
Hive ----> HQL----->HDFS上的数据----->MR
HBase---->API---->HDFS上的数据----->MR
可以让hive集成HBase,hbase作为数据存储的介质!hive作为分析引擎,来分析Hbase中已经存储的数据!
hbase中数据的逻辑结构是一个表,hive对表中的结构化数据进行分析!
二、两种场景:
1、数据已经在hbase中,只需要根据hbase中已经有的表的结构,在hive中进行参照,创建hive中的表
1 CREATE external TABLE hive_HBase_dept_table( 2 deptid int, 3 deptname string, 4 num int 5 ) 6 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 7 WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:deptname,info:num") 8 TBLPROPERTIES ("hbase.table.name" = "dept");
代码的相关说明:
1、创建的表应该是外部表,原因:数据在hbase中,hive不在维护
2、stored by:代表向表中读写数据时,借助此handler类完成操作(数据在hbase中,没有存在hdfs上)
3、在进行映射时,字段的顺序要和列的顺序一致
4、hive中的列的类型要和hase中的数据类型一致,或者需要保证转换不能失败
2、数据还没有导入hbase中,可以现在hive中建表,在hive的表中执行insert语句,将数据导入到hbase中
1 CREATE TABLE hive_HBase_dept2_table( 2 deptid int, 3 deptname string, 4 num int 5 ) 6 STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 7 WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:deptname,info:num") 8 TBLPROPERTIES ("hbase.table.name" = "dept2");
代码的相关说明:
1、这种情况hive负责数据的生命周期,所以hive应该为管理表
2、注意handler的jar包版本要与hbase的版本匹配