hive關聯hbase表

Hive系列文章

  1. Hive表的基本操作
  2. Hive中的集合數據類型
  3. Hive動態分區詳解
  4. hive中orc格式表的數據導入
  5. Java通過jdbc連接hive
  6. 通過HiveServer2訪問Hive
  7. SpringBoot連接Hive實現自助取數
  8. hive關聯hbase表
  9. Hive udf 使用方法
  10. Hive基于UDF進行文本分詞
  11. Hive窗口函數row number的用法
  12. 數據倉庫之拉鏈表

Hbase是一種NoSQL數據庫,這意味著它不像傳統的RDBMS數據庫那樣支持SQL作為查詢語言。一種方法是使用hive關聯hbase表,可以完成對hbase表的數據插入(insert)和查詢(select)。

Hive和HBase的通信原理

Hive與HBase整合的實現是利用兩者本身對外的API接口互相通信來完成的,這種相互通信是通過$HIVE_HOME/lib/hive-hbase-handler-{hive.version}.jar工具類實現的。通過HBaseStorageHandler,Hive可以獲取到Hive表所對應的HBase表名,列簇和列,InputFormat、OutputFormat類,創建和刪除HBase表等。Hive訪問HBase中表數據,實質上是通過MapReduce讀取HBase表數據,其實現是在MR中,使用HiveHBaseTableInputFormat完成對HBase表的切分,獲取RecordReader對象來讀取數據。對HBase表的切分原則是一個Region切分成一個Split,即表中有多少個Regions,MR中就有多少個Map;讀取HBase表數據都是通過構建Scanner,對表進行全表掃描,如果有過濾條件,則轉化為Filter。當過濾條件為rowkey時,則轉化為對rowkey的過濾;Scanner通過RPC調用RegionServer的next()來獲取數據;

基本通信原理如下:

新建hive表關聯hbase表

hive關聯的hbase表,對應的hbase表如果不存在,會自動創建,test是hbase的一個namespace,相當于mysql中的database需要提前建好:create_namespace 'test'。

create table if not exists test.test
(
id string comment '用戶id',
name string comment '姓名'
)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping" = ":key,info:name")
tblproperties("hbase.table.name" = "test:test");
SQL

上面的命令創建了一張hive表,跟hbase表是聯系在一起的,對應關系:



表名可以不相同的,但是通常為了統一,表命建得相同。

通過hive插入數據到hbase表

如果有這么一個需求,我們想把hive一張結果表存一份數據到hbase,可以使用insert select方式,將hive表的數據插入到hbase表中去。假設現在有一張hive表test.test2

hive> select * from test.test2;
OK
1   tom
2   jack
3   alice
SQL

將hive表test.test2的數據導入到hbase表:

insert into test.test select * from test.test2;
SQL

這就將數據導入hbase表了,這時候不管是在hive里面,還是hbase shell里面,都是可以直接查詢到數據的。

hive> select * from test.test;
OK
1   tom
2   jack
3   alice
SQL

從hbase里面scan也是有數據的。

hbase(main):005:0> scan 'test:test'
ROW                              COLUMN+CELL                                                                                
 1                               column=info:name, timestamp=1590221288866, value=tom                                       
 2                               column=info:name, timestamp=1590221288866, value=jack                                      
 3                               column=info:name, timestamp=1590221288866, value=alice                                     
Bash

實際數據是存儲在hbase數據目錄里面的:

[hadoop@slave3 ~]hdfs dfs -ls /hbase/data/test/test
Found 3 items
drwxr-xr-x   - hadoop supergroup          0 2020-05-23 16:05 /hbase/data/test/test/.tabledesc
drwxr-xr-x   - hadoop supergroup          0 2020-05-23 16:05 /hbase/data/test/test/.tmp
drwxr-xr-x   - hadoop supergroup          0 2020-05-23 16:05 /hbase/data/test/test/722a0bfced3a534029e5093ebba1d55c
[hadoop@slave3 ~] hdfs dfs -ls /user/hive/warehouse/test.db/test
Bash

對hbase表做統計查詢

有時候我們想對hbase表的數據進行統計分析,可以通過mapreduce / spark API,通過代碼邏輯統計分析,但是這些成本有點高,能用sql的盡量用sql做大數據分析,這時候hive關聯hbase表查詢就派上用場了。

hive> select name, count(1) from test.test group by name;

alice   1
jack    1
tom 1





作者:柯廣的網絡日志

微信公眾號:Java大數據與數據倉庫