Hive支持通过内表或外表两种方式访问E-MapReduce(简称EMR)HBase数据。本文通过示例为您介绍,如何使用EMR上的Hive处理EMR HBase数据。
前提条件
已创建Hadoop集群,并且选择了HBase和Zookeeper服务,详情请参见创建集群。
Hive通过内表访问HBase
如果HBase中没有已经创建好的表,则可以在Hive中创建表,Hive会自动把表结构和数据写入到HBase中。本示例是在Hive中新建表访问HBase。
- 进入Hive命令行。
- 使用SSH方式登录到集群主节点,详情请参见登录集群。
- 执行以下命令,进入Hive命令行。
hive
返回信息如下所示时,表示进入Hive命令行。
Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
- 在Hive中创建并查询表数据。
- 执行以下命令,在Hive中创建HBase表。
create table hive_hbase_table(key int, value string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = ":key,cf1:val")
tblproperties("hbase.table.name" = "hive_hbase_table", "hbase.mapred.output.outputtable" = "hive_hbase_table");
说明 表的存储方式是HBaseStorageHandler,可以存储和读取HBase数据。
- 执行以下命令,向表中插入数据。
insert into hive_hbase_table values(212,'bab');
- 执行以下命令,查看表数据。
select * from hive_hbase_table;
返回信息如下。
OK
212 bab
Time taken: 0.337 seconds, Fetched: 1 row(s)
- 进入HBase命令行。
- 使用SSH方式登录到集群主节点,详情请参见登录集群。
- 执行以下命令,进入HBase命令行。
hbase shell
返回信息如下所示时,表示进入HBase命令行。

- 执行以下命令,查看是否已经通过Hive在HBase中创建了表。
describe 'hive_hbase_table'
返回信息如下。

说明 查看表已存在,说明Hive已经在HBase中创建了表。
- 执行以下命令,在HBase中查看Hive写的数据是否已存在。
scan 'hive_hbase_table'
返回信息如下。
ROW COLUMN+CELL
212 column=cf1:val, timestamp=1624513121062, value=bab
1 row(s) in 0.2320 seconds
说明 查看数据已存在,并且与在Hive中插入的数据一致,说明Hive已经成功访问了HBase的数据。
Hive通过外表访问HBase
如果已经在HBase中创建了表,想通过Hive访问,则可以使用Hive外表的方式与HBase中的表建立映射关系,进而通过Hive访问HBase中已经存在的表。
- 进入HBase命令行。
- 使用SSH方式登录到集群主节点,详情请参见登录集群。
- 执行以下命令,进入HBase命令行。
hbase shell
返回信息如下所示时,表示进入HBase命令行。

- 在HBase中创建并查询表数据。
- 执行以下命令,在HBase中创建表。
- 执行以下命令,向表中插入数据。
put 'hbase_table','1122','f:col1','hello'
- 执行以下命令,查看表数据。
scan 'hbase_table'
返回信息如下。
ROW COLUMN+CELL
1122 column=f:col1, timestamp=1627027165760, value=hello
1 row(s) in 0.0170 seconds
- 进入Hive命令行。
- 使用SSH方式登录到集群主节点,详情请参见登录集群。
- 执行以下命令,进入Hive命令行。
hive
返回信息如下所示时,表示进入Hive命令行。
Logging initialized using configuration in file:/etc/ecm/hive-conf-2.3.5-2.0.3/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
- 执行以下命令,在Hive中创建外表,并与HBase中的表建立映射关系。
create external table hbase_table(key int,col1 string,col2 string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = "f:col1,f:col2")
tblproperties("hbase.table.name" = "hbase_table", "hbase.mapred.output.outputtable" = "hbase_table");
- 执行以下命令,在Hive中查看hbase_table数据。
select * from hbase_table;
返回信息如下。
OK
1122 hello NULL
Time taken: 2.201 seconds, Fetched: 1 row(s)
说明 查看数据已存在,并且与在HBase中插入的数据一致,说明Hive已经成功访问了HBase的数据。