首先建立一张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')
我们分别查询一下这三张表,如下:
test-hbase-hive-table-1
test-hbase-hive-table-2
test-hbase-hive-table-3
可以看到,同一张HBase表可以映射多张Hive外部表,并且查询列互不影响。
下面做一个小实验,通过Hive端向HBase三张映射表中分别插入同一行不同列数据,是否会相互影响呢?
一. 测试 insert into 语法
向表 test_hbase_3 中新插入一行数据,如下:
多添加一个字段会怎样?
可见,列的数量是严格要求的,下面我们正常插入,如下:
insert into table data_tmp.test_hbase_3 select 'r2','v1','v2';
我们分别查询下三表数据,如下:
向表 test_hbase_1 中新插入一行数据,id 也为 r1 ,如下:
insert into table data_tmp.test_hbase_1 select 'r1','v1-1';
结论:可见向不同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,如下:
我们发现数据已更新,下面我们分别查询下表 test_hbase_1和表 test_hbase_2,如下:
结论: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数据。
既然这样,那就大胆放心操作吧!