摘要
Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询、同时也可以将hive表中的数据映射到Hbase中。
应用场景
2.1 将ETL操作的数据存入HBase
2.2 HBase作为Hive的数据源
2.3 构建低延时的数据仓库
环境准备
3.1 hive与hbase整合环境配置
-
修改hive-site.xml文件,添加配置属性(zookeeper的地址)
[root@hadoop01 conf]# vim hive-site.xml
<property> <name>hbase.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> |
-
引入hbase的依赖包
将hbase安装目录下的lib文件夹下的包导入到hive的环境变量中,在hive-env.sh 文件中添加
[root@hadoop01 conf]# vim hive-env.sh
export HIVE_CONF_DIR=/usr/local/hive/conf export HIVE_CLASSPATH=$HIVE_CLASSPATH:$HBASE_HOME/lib/* |
至此、hive与hbase整合环境准备完成。
实战
4.1 hbase表映射到hive表中
-
在hbase中创建表:表名hbase_test, 有三个列族 f1、f2、f3
create |
-
插入数据
put 'hbase_test','r1','f1:name','zhangsan' put 'hbase_test','r1','f2:age','20' put 'hbase_test','r1','f3:sex','male' put 'hbase_test','r2','f1:name','lisi' put 'hbase_test','r2','f2:age','30' put 'hbase_test','r2','f3:sex','female' put 'hbase_test','r3','f1:name','wangwu' put 'hbase_test','r3','f2:age','40' put 'hbase_test','r3','f3:sex','male' |
-
查询数据
-
创建基于hbase的hive表
CREATE EXTERNAL TABLE hiveFromHbase( rowkey string, f1 map<STRING,STRING>, f2 map<STRING,STRING>, f3 map<STRING,STRING> ) STORED BY WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:") TBLPROPERTIES ("hbase.table.name" = "hbase_test"); |
这里使用外部表映射到HBase中的表,这样,在Hive中删除表,并不会删除HBase中的表,否则,就会删除。另外,除了rowkey,其他三个字段使用Map结构来保存HBase中的每一个列族。
-
hbase.columns.mapping
Hive表和HBase表的字段映射关系,分别为:Hive表中第一个字段映射:key(rowkey),第二个字段映射列族f1,第三个字段映射列族f2,第四个字段映射列族f3
-
hbase.table.name
HBase中表的名字
-
hive中查询hbase表
可以看到,Hive中有3行数据,因为有3个rowkey,每一个列族的列和值,分别被存储到Map结构中
-
Hive中插入数据到HBase表
insert into table hiveFromHbase SELECT map('name','zhaoliu') AS f1, map('age','50') AS f2, map('sex','male') AS f3 from person limit 1; |
插入成功后查看2张表的数据
hive表hiveFromHbase:
Hbase表hbase_test:
Hive中的外部表hiveFromHbase,就和其他外部表一样,只有一份元数据,真正的数据是在HBase表中,Hive通过hive-hbase-handler来操作HBase中的表。
4.2 hive表映射到hbase表中
- 创建映射hbase的表
create table hive_test( id string, name string, age int, address string )STORED BY WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f2:age,f3:address") TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive"); |
-
查看hbase映射表是否产生
-
查看hbase映射表的表结构和数据
由于hive表中没有加载数据,此时hbase中映射的表也无数据
-
Hive表加载数据
数据来源于另一张表hive_source;
查看hive_source的表结构和数据 加载数据: insert overwrite table hive_test select * from hive_source; |
-
查看hive和hbase中表的数据
映射表可以查看到hive表中的数据。