hive關(guān)聯(lián)hbase表

Hive系列文章

  1. Hive表的基本操作
  2. Hive中的集合數(shù)據(jù)類型
  3. Hive動態(tài)分區(qū)詳解
  4. hive中orc格式表的數(shù)據(jù)導(dǎo)入
  5. Java通過jdbc連接hive
  6. 通過HiveServer2訪問Hive
  7. SpringBoot連接Hive實(shí)現(xiàn)自助取數(shù)
  8. hive關(guān)聯(lián)hbase表
  9. Hive udf 使用方法
  10. Hive基于UDF進(jìn)行文本分詞
  11. Hive窗口函數(shù)row number的用法
  12. 數(shù)據(jù)倉庫之拉鏈表

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

Hive和HBase的通信原理

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

基本通信原理如下:

新建hive表關(guān)聯(lián)hbase表

hive關(guān)聯(lián)的hbase表,對應(yīng)的hbase表如果不存在,會自動創(chuàng)建,test是hbase的一個namespace,相當(dāng)于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

上面的命令創(chuàng)建了一張hive表,跟hbase表是聯(lián)系在一起的,對應(yīng)關(guān)系:



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

通過hive插入數(shù)據(jù)到hbase表

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

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

將hive表test.test2的數(shù)據(jù)導(dǎo)入到hbase表:

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

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

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

從hbase里面scan也是有數(shù)據(jù)的。

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

實(shí)際數(shù)據(jù)是存儲在hbase數(shù)據(jù)目錄里面的:

[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表做統(tǒng)計(jì)查詢

有時候我們想對hbase表的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析,可以通過mapreduce / spark API,通過代碼邏輯統(tǒng)計(jì)分析,但是這些成本有點(diǎn)高,能用sql的盡量用sql做大數(shù)據(jù)分析,這時候hive關(guān)聯(lián)hbase表查詢就派上用場了。

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

alice   1
jack    1
tom 1





作者:柯廣的網(wǎng)絡(luò)日志

微信公眾號:Java大數(shù)據(jù)與數(shù)據(jù)倉庫