使用Hive或Impala執行SQL語句,對存儲在HBase中的數據操作
Hive
Impala
HBase
HiveQL
大數據
〇、摘要
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,並提供簡單的SQL查詢功能,可以將SQL語句轉換為MapReduce任務進行運行。
HBase(Hadoop Database),是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,只能通過Rowkey來取數據,無法進行SQL查詢。
因此如果Hive可以從HBase中取數據,並結合Hive的SQL查詢功能,便能做到較為復雜的SQL查詢操作。
Impala對存儲在HDFS、HBase的數據提供直接查詢互動的SQL。除了像Hive使用相同的統一存儲平台,Impala也使用相同的元數據,SQL語法(Hive SQL),ODBC驅動程序和用戶界面(Hue Beeswax)。Impala還提供了一個熟悉的面向批量或實時查詢和統一平台。
達成目標:1、支持HBase多表聯接查詢等較復雜的SQL查詢操作。
一、基礎環境
CentOS-6.5
JDK-1.7
hive:hive-0.13.1+cdh5.3.6+397,impala:impala-2.1.5+cdh5.3.6+0,spark:spark-1.2.0+cdh5.3.6+379,
elasticsearch:elasticsearch-1.7.1,elasticsearch-hadoop-hive:elasticsearch-hadoop-hive-2.1.1
二、數據存儲在HBase中,使用Hive執行SQL語句
無論是使用Hive還是Impala還是Spark,第一步都是讓他們先知道數據的表結構。
Hive的內置數據類型可以分為兩大類:(1)、基礎數據類型;(2)、復雜數據類型。其中,基礎數據類型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
Ⅰ、創建Hive外部表
- 先有HBase再有Hive
在HBase中已經存在一個名為hbaseanqi的表,表中一列族名為angel,列族中存在五列:name、visible、cdecimal、cdate、position。
需要在Hive中創建一個名為anqi的表,其中表中存在五列:BIGINT型的id、STRING型的name、BOOLEAN型的visible、DECIMAL(12,2)型的cdecimal、TIMESTAMP型的cdate。
Hive中anqi表的id、name、visible、cdecimal和列cdate分別來自於HBase中hbaseanqi表的Rowkey及angel:name、angel:visible、angel:cDecimal、angel:cdate列(angel為列族名)。
那么執行以下語句,在Hive中創建一個外部表:
CREATE EXTERNAL TABLE default.hive_hbase_anqi(
id BIGINT,
name STRING,
visible BOOLEAN,
cdecimal DECIMAL(12,2),
cdate TIMESTAMP)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, angel:name, angel:visible, angel:cdecimal, angel:cdate")
TBLPROPERTIES("hbase.table.name" = "hbaseanqi");
可以看到,語句中通過WITH SERDEPROPERTIES指定了Hive與HBase的列映射關系。通過以上語句,在Hive中可以看到結構正確的表,並可以在Hue中看到HBase中的數據。
注意:
建立起的Hive表中所有字段均變為小寫。這同ES-Hive一樣。詳情見:使用Hive或Impala執行SQL語句,對存儲在Elasticsearch中的數據操作。
- 先有Hive再有HBase
因為在Hive中執行上面語句時,Hive需要去HBase中獲取一些信息,若是HBase中並無相關表,執行以上語句直接拋出異常:HBase table hbaseanqi doesn't exist while the table is declared as an external table。
因此在無HBase表的情況下,並不能創建Hive對應表。
這與ElasticSearch和Hive建立關聯時的情況不一樣。當在ElasticSearch並無相應index-type(索引-類型)時,Hive依然可以創建表成功。具體詳情可以查看:使用Hive或Impala執行SQL語句,對存儲在Elasticsearch中的數據操作 一文。
Ⅱ、從HBase讀
我們選擇以下幾條有代表性的SQL查詢語句,來驗證使用Hive可以對存儲在HBase中的數據進行正確的查詢操作。
Decimal類型數據求和
SELECT SUM(cdecimal) FROM default.hive_hbase_anqi;
經驗證,可以正確的得到精確的求和值。TIMESTAMP類型數據排序
SELECT * from default.hive_hbase_anqi ORDER BY cdate limit 5;
經驗證,可以依據TIMESTAMP值正確排序。普通表與外表關聯
select * from hive_hbase_anqi,sample_08 WHERE hive_hbase_anqi.id=sample_08.salary;
其中sample_08表是Hive普通表,hive_hbase_anqi是數據存儲在HBase中的Hive外表。
經驗證,通過執行上面語句,可以將Hive普通表與Hive的HBase外表進行正確的關聯。
Ⅲ、向HBase寫
insert OVERWRITE table hive_hbase_anqi select salary,dtime,sdecimal,sname,svisible from sample_09;
將Hive普通表sample_09中的數據導入Hive外部表anqi中,去HBase中查看,可以看到數據被正確導入。
Hive四種數據導入方式:從本地文件系統中導入數據到Hive表;從HDFS上導入數據到Hive表;從別的表中查詢出相應的數據並導入到Hive表中;在創建表的時候通過從別的表中查詢出相應的記錄並插入到所創建的表中。
向HBase寫不是很方便。
三、數據存儲在HBase中,使用Impala執行SQL語句
在Impala中執行INVALIDATE METADATA
、REFRESH table_name
語句便可讓 Impala識別在Hive中新建的或已發生變動的表。
Ⅰ、從HBase讀
Hive中建立的表,impala可以直接讀取使用。執行復雜SQL語句時,impala明顯比hive快很多。
同樣的,我們選擇上面(一.2)節中的典型SQL語句進行驗證,Impala-SQL均可以快速正確的返回結果,結果與Hive-SQL執行結果一致。
Ⅱ、向HBase寫
Impala的插入數據SQL語句與Hive相差很大,Impala更接近標准SQL。
- 普通添加一行
insert into hive_hbase_anqi values(0,'1999-09-09',8.88,'name',true);
通過執行此語句,可以向HBase中添加一行數據。注意values里的順序,id首位,其它列按列名稱排序。 - 從HBase其他表導入
insert into hive_hbase_anqi(id,name,cdate) select id,name,udate from hive_hbase_xi;
通過執行此語句,可以向HBase中添加一批從hive_hbase_xi表中取到的數據。
四、綜上所述
數據存儲在HBase中,使用Impala或Hive執行SQL語句進行操作是一個好主意。雖然使用Impala和使用Hive同樣可以正確執行,但使用Impala比使用Hive更加方便且更高效。目標達成。
作者 @王安琪
aitanjupt@hotmail.com