配置 hive 与 hbase 整合的目的是利用 HQL 语法实现对 hbase 数据库的增删改查操作,基本原理就是利用两者本身对外的API接口互相进行通信,两者通信主要是依靠hive_hbase-handler.jar工具类。
但请注意:使用Hive操作HBase中的表,只是提供了便捷性,前面章节已经介绍,hiveQL引擎使用的是MapReduce,对于性能上,表现比较糟糕,在实际应用过程中可针对不同的场景酌情使用。
至于整合的环境的搭建,请小伙伴自行baidu,不好意思
比如hbase中的如下表,结构如下
开始整合
1 进入hive创建映射表
这里使用外部表映射到HBase中的表,这样,在Hive中删除表,并不会删除HBase中的表,否则,就会删除
Hive中的外部表hive_mytest_4,就和其他外部表一样,只有一份元数据,真正的数据是在HBase表中,Hive通过hive-hbase-handler来操作HBase中的表。
create external table if not exists hive_mytest_4(
rowkey string,
yuwen string,
shuxue string,
english string,
grade map<string, string>
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,course:yuwen,course:shuxue,course:english,grade:")
TBLPROPERTIES ("hbase.table.name" = "ns1:mytest_4");
解读说明:
1 前面部分是hive的表名和列信息,后面部分是hbase中表名和列信息
2 hbase中,只有列族的,没有列标识符的,如下面的grade (此情况最好避免)
hbase中用grade:表示,hive中要用map类型的,较特殊,用grade map<string, string>表示
3 hbase中的rowkey用:key来表示
执行语句 时,将多余的空格去掉,否则会报错,到此,整合就结束了
演示通过hive往hbase表中添加数据
1 准备如下数据 text1.txt
stu_1,10,11,13,grade:chun
stu_2,12,13,14,grade:chun
stu_3,102,513,124,grade:good
stu_4,612,143,134,grade:good
stu_5,122,193,154,grade:yiban
stu_6,142,183,134,grade:yiban
stu_7,152,133,164,grade:verygood
stu_8,12,153,164,grade:haoyangde
2 创建中间的hive临时表temp_table_1,并把临时表里添加数据
//临时表
create table temp_table_1(
rowkey string,
yuwen string,
shuxue string,
english string,
grade map<string, string>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LINES TERMINATED BY '\n';
//将数据加载到临时表
LOAD DATA LOCAL INPATH '/tmp/text1.txt' INTO TABLE temp_table_1;
select * from temp_table_1;
3 将临时表(temp_table_1)的数据插入到正式的表中(hive_mytest_4)
insert into table hive_mytest_4 select * from temp_table_1;
4 剩下的hive查询,hbase查询,该怎么操作就怎么操作就可以了
select * from hive_mytest_4;
select rowkey,yuwen,shuxue,english,grade['grade'] from hive_mytest_4;