首先建立一张HBase测试表,如下:
hbase(main):031:0> create 'test:table1',{NAME => 'f',COMPRESSION => 'SNAPPY',DATA_BLOCK_ENCODING => 'FAST_DIFF',VERSIONS=> 1}
然后从命令行写入一行数据,如下:
hbase(main):032:0> put 'test:table1','r1','f:c1','v1'
hbase(main):033:0> put 'test:table1','r1','f:c2','v2'
我们看一下数据,如下:
hbase(main):034:0> scan 'test:table1'
ROW COLUMN+CELL
r1 column=f:c1, timestamp=1547545470139, value=v1
r1 column=f:c2, timestamp=1548315629301, value=v2
然后我们基于此HBase表建立三张Hive映射表,建表语句分别如下:
test_hbase_3 :
CREATE EXTERNAL TABLE data_tmp.test_hbase_1 (
id STRING,
c1 STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
'hbase.table.name'='test:table1',
'hbase.mapred.output.outputtable'='test:table1',
'hbase.columns.mapping'=':key,
f:c1')
test_hbase_2:
CREATE EXTERNAL TABLE data_tmp.test_hbase_2 (
id STRING,
c2 STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
'hbase.table.name'='test:table1',
'hbase.mapred.output.outputtable'='test:table1',
'hbase.columns.mapping'=':key,
f:c2')
test_hbase_3:
CREATE EXTERNAL TABLE data_tmp.test_hbase_3 (
id STRING,
c1 STRING,
c2 STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
'hbase.table.name'='test:table1',
'hbase.mapred.output.outputtable'='test:table1',
'hbase.columns.mapping'=':key,
f:c1,
f:c2')
我们分别查询一下这三张表,如下:
![](https://img.haomeiwen.com/i7875120/f047f6c2cfb3236d.png)
![](https://img.haomeiwen.com/i7875120/5db215be6ce48512.png)
![](https://img.haomeiwen.com/i7875120/86e70a4981a03ea7.png)
可以看到,同一张HBase表可以映射多张Hive外部表,并且查询列互不影响。
下面做一个小实验,通过Hive端向HBase三张映射表中分别插入同一行不同列数据,是否会相互影响呢?
一. 测试 insert into 语法
- 向表 test_hbase_3 中新插入一行数据,如下:
多添加一个字段会怎样?
![](https://img.haomeiwen.com/i7875120/b20406f5eb9722b0.png)
可见,列的数量是严格要求的,下面我们正常插入,如下:
insert into table data_tmp.test_hbase_3 select 'r2','v1','v2';
我们分别查询下三表数据,如下:
![](https://img.haomeiwen.com/i7875120/64bd3eadb936fdaf.png)
![](https://img.haomeiwen.com/i7875120/3984859ca4fc8b09.png)
![](https://img.haomeiwen.com/i7875120/ec89f2e76b001c6a.png)
- 向表 test_hbase_1 中新插入一行数据,id 也为 r1 ,如下:
insert into table data_tmp.test_hbase_1 select 'r1','v1-1';
![](https://img.haomeiwen.com/i7875120/06cd6e35fe136d05.png)
![](https://img.haomeiwen.com/i7875120/7cf7695593ae2e2d.png)
![](https://img.haomeiwen.com/i7875120/5dea639be2d14fad.png)
结论:可见向不同Hive外部表中插入数据是不会影响HBase其他列的。
二. 测试 insert overwrite 语法
- 覆盖写表test_hbase_1, id = r1,我们观察下test_hbase_2 c2 列会不会被清空。
insert overwrite table data_tmp.test_hbase_1 select 'r1','v1-2';
我们查询下表 test_hbase_3,如下:
![](https://img.haomeiwen.com/i7875120/12ac7f480c9b993b.png)
我们发现数据已更新,下面我们分别查询下表 test_hbase_1和表 test_hbase_2,如下:
![](https://img.haomeiwen.com/i7875120/3932368d7c6bf6f1.png)
![](https://img.haomeiwen.com/i7875120/146f4b756a7628fc.png)
结论:insert into 与 insert overwrite 操作HBase-Hive映射外部表结果是一样的,且均是基于Hive表所属列进行更新,不会影响其他列的值。
下面我们将此三张表删除掉,执行如下语句:
drop table test_hbase_1 ;
drop table test_hbase_2 ;
drop table test_hbase_3 ;
现在,我们查看下HBase表数据,如下:
hbase(main):035:0> scan 'test:table1'
ROW COLUMN+CELL
r1 column=f:c1, timestamp=1548317635798, value=v1-2
r1 column=f:c2, timestamp=1548315629301, value=v2
r2 column=f:c1, timestamp=1548317046763, value=v1
r2 column=f:c2, timestamp=1548317046763, value=v2
2 row(s) in 0.0200 seconds
结论: 删除Hive-HBase映射外部表不会删除HBase数据。
既然这样,那就大胆放心操作吧!
网友评论