版本說明:java
HDP:3.0.1.0sql
Hive:3.1.0shell
HBase:2.0.0apache
以前學習 HBase 就有疑惑,HBase 雖然能夠存儲數億或數十億行數據,可是對於數據分析來講,不太友好,只提供了簡單的基於 Key 值的快速查詢能力,無法進行大量的條件查詢。微信
不過,Hive 與 HBase 的整合能夠實現咱們的這個目標。不只如此,還能經過 Hive 將數據批量地導入到 HBase 中。app
<!--more-->工具
Hive 與 HBase 整合的實現是利用二者自己對外的 API 接口互相通訊來完成的,其具體工做交由 Hive 的 lib 目錄中的 hive-hbase-handler-xxx.jar 工具類來實現對 HBase 數據的讀取。oop
Hive 與 HBase 整合的適用場景:學習
**一、**經過 Hive 與 HBase 整合,能夠將 HBase 的數據經過 Hive 來分析,讓 HBase 支持 JOIN、GROUP 等 SQL 查詢語法。大數據
**二、**實現將批量數據導入到 HBase 表中。
須要有如下依賴,ambari 已經爲咱們作好了這一切:
注意,這裏與HDP 2.x不一樣:在 HDP 3.0 中對 Hive-3.1.0 的更改是全部 StorageHandler 必須標記爲「外部」,沒有 StorageHandler 建立的非外部表。若是在建立 Hive 表時存在相應的 HBase 表,它將模仿「外部」表的 HDP 2.x 語義。若是在建立 Hive 表時不存在相應的 HBase 表,則它將模仿非外部表的 HDP 2.x 語義。
總結: 無論 HBase 表是否存在,在 Hive 中都要使用 external 表來與 HBase 表進行關聯,若是關聯的 HBase 表不存在,Hive 會自動建立Hbase 表。
CREATE EXTERNAL TABLE hive_table (key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "default:hbase_table");
這裏簡單說一下建表時的參數:
此時,hive_table 與 hbase_table 都是空的。咱們準備一些數據:
insert into hive_table (key, value) values(1, "www.ymq.io");
insert 語句會觸發 map 任務,以下圖所示:
任務完成以後,Hive 與 HBase 表中就都存在數據了。
# hive_table 表數據 +-----------------+-------------------+ | hive_table.key | hive_table.value | +-----------------+-------------------+ | 1 | www.ymq.io | +-----------------+-------------------+
# hbase_table表數據 hbase(main):002:0> scan 'hbase_table' ROW COLUMN+CELL 1 column=cf1:val, timestamp=1558710260266, value=www.ymq.io 1 row(s) Took 0.2400 seconds
當將 hive_table 表刪除,對應的 hbase_table 表不受影響,裏面依舊有數據。當刪除 hbase_table 表後,再查詢 hive_table 表數據,會報錯:Error: java.io.IOException: org.apache.hadoop.hbase.TableNotFoundException: hbase_table (state=,code=0)
,這是正常的。
注意!注意!注意: 在上述示例中,咱們使用的 insert 命令向 Hive 表中插入數據。對於批量數據的插入,仍是建議使用 load 命令,但對於 Hive 外部表來講,不支持 load 命令。咱們能夠先建立一個 Hive 內部表,將數據 load 到該表中,最後將查詢內部表的全部數據都插入到與 Hbase 關聯的 Hive 外部表中,就能夠了,至關於中轉一下。
建立 HBase 表:
create 'default:people', {NAME=>'basic_info'}, {NAME=>'other_info'}
插入一些數據:
put 'people', '00017','basic_info:name','tom' put 'people', '00017','basic_info:age','17' put 'people', '00017','basic_info:sex','man' put 'people', '00017','other_info:telPhone','176xxxxxxxx' put 'people', '00017','other_info:country','China' put 'people', '00023','basic_info:name','mary' put 'people', '00023','basic_info:age',23 put 'people', '00023','basic_info:sex','woman' put 'people', '00023','basic_info:edu','college' put 'people', '00023','other_info:email','cdsvo@163.com' put 'people', '00023','other_info:country','Japan' put 'people', '00018','basic_info:name','sam' put 'people', '00018','basic_info:age','18' put 'people', '00018','basic_info:sex','man' put 'people', '00018','basic_info:edu','middle' put 'people', '00018','other_info:telPhone','132xxxxxxxx' put 'people', '00018','other_info:country','America' put 'people', '00026','basic_info:name','Sariel' put 'people', '00026','basic_info:age',26 put 'people', '00026','basic_info:edu','college' put 'people', '00026','other_info:telPhone','178xxxxxxxx' put 'people', '00026','other_info:email','12345@126.com' put 'people', '00026','other_info:country','中國'
再建立一個簡單的 Hive 外部表,語法與以前的一致:
create external table people ( id int, name string, age string, sex string, edu string, country string, telPhone string, email string ) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties ("hbase.columns.mapping" = " :key, basic_info:name, basic_info:age, basic_info:sex, basic_info:edu, other_info:country, other_info:telPhone, other_info:email ") tblproperties("hbase.table.name" = "default:people");
查詢所有數據:
select * from people;
條件查詢:
# 根據性別查詢 select * from people where sex = 'man'; # 根據年齡查詢 select * from people where age > 18;
這樣,咱們就可使用 Hive 來分析 HBase 中的數據了。
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是 人才。
白嫖很差,創做不易。 各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!
若是本篇博客有任何錯誤,請批評指教,不勝感激 !
本文來自: 微信公衆號【大數據實戰演練】。閱讀更多精彩好文,歡迎關注微信公衆號【大數據實戰演練】。