前置准备

这里需要大家预先安装 Hadoop(2.7.7)集群、Hive(2.3.6)、HBase(1.4.13)。

一、Hive读取HBase中的数据

1.1 先在HBase上创建一张表hbase_hive(方便测试使用默认命名空间default)

hbase(main):025:0> create 'hbase_hive','info'

1.2 向hbase_hive表中插入两条测试数据

hbase(main):031:0> put 'hbase_hive','user001','info:name','xiaokang'
hbase(main):032:0> put 'hbase_hive','user001','info:age',18
hbase(main):033:0> put 'hbase_hive','user002','info:name','xiaokang1'
hbase(main):034:0> put 'hbase_hive','user002','info:age',19

1.3 在Hive中创建外部表hive_user并关联到HBase的hbase_hive

create external table hive_user(userid string,name string,age int) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,info:name,info:age") tblproperties("hbase.table.name" = "hbase_hive");

1.4 读取测试

hive (default)> select * from hive_user limit 0,1;
OK
hive_user.userid hive_user.name hive_user.age
user001 xiaokang 18
Time taken: 0.989 seconds, Fetched: 1 row(s)

1.5 向HBase的hbase_hive表中再添加一条数据进行读取测试

hbase(main):033:0> put 'hbase_hive','user003','info:name','xiaokang2'
hbase(main):034:0> put 'hbase_hive','user003','info:age',20

hive (default)> select * from hive_user;
OK
hive_user.userid hive_user.name hive_user.age
user001 xiaokang 18
user002 xiaokang1 19
user003 xiaokang2 20
Time taken: 0.471 seconds, Fetched: 3 row(s)

二、Hive写入数据到HBase中

2.1 先在HBase上创建一张表from_hive(数据导入到此表中)

hbase(main):025:0> create 'from_hive','info'

2.2 在Hive中创建外部表hive_user_hbase并关联到HBase的from_hive

create external table hive_user_hbase(userid string,name string,age int) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,info:name,info:age") tblproperties("hbase.table.name" = "from_hive");

2.3 创建临时表(用于将数据写入到hive_user_hbase)

create temporary table tmp_user(userid string,name string,age int) row format delimited fields terminated by '\t';

2.4 向临时表中加载数据

load data local inpath '/home/xiaokang/user.txt' into table tmp_user;

#查询验证数据是否加载成功
hive (default)> select * from tmp_user;
OK
tmp_user.userid tmp_user.name tmp_user.age
user111 xiaokang 18
user222 xiaokang 19
user333 xiaokang 20
user444 xiaokang 21
Time taken: 0.379 seconds, Fetched: 4 row(s)

2.5 写入数据

hive (default)> insert into table hive_user_hbase select * from tmp_user;

2.6 在HBase中验证数据是否写入

#扫描全表(大数据量的情况下不推荐,会造成机器崩溃)
hbase(main):041:0> scan 'from_hive'
ROW COLUMN+CELL
user111 column=info:age, timestamp=1585814173216, value=18
user111 column=info:name, timestamp=1585814173216, value=xiaokang
user222 column=info:age, timestamp=1585814173216, value=19
user222 column=info:name, timestamp=1585814173216, value=xiaokang
user333 column=info:age, timestamp=1585814173216, value=20
user333 column=info:name, timestamp=1585814173216, value=xiaokang
user444 column=info:age, timestamp=1585814173216, value=21
user444 column=info:name, timestamp=1585814173216, value=xiaokang
4 row(s) in 0.0320 seconds