一个简单的测试:HBase-Hive 映射表

96
步闲
2019.01.24 16:24 字数 476

首先建立一张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 语法

  1. 向表 test_hbase_3 中新插入一行数据,如下:

多添加一个字段会怎样?

可见,列的数量是严格要求的,下面我们正常插入,如下:

  insert into table data_tmp.test_hbase_3 select 'r2','v1','v2';

我们分别查询下三表数据,如下:

  1. 向表 test_hbase_1 中新插入一行数据,id 也为 r1 ,如下:
  insert into table data_tmp.test_hbase_1 select 'r1','v1-1';

结论:可见向不同Hive外部表中插入数据是不会影响HBase其他列的。

二. 测试 insert overwrite 语法

  1. 覆盖写表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数据。

既然这样,那就大胆放心操作吧!

Hbase 工作笔记
Gupao