使用Hive或Impala執行SQL語句,對存儲在HBase中的數據操做

使用Hive或Impala執行SQL語句,對存儲在HBase中的數據操做

Hive Impala HBase HiveQL 大數據javascript


 

〇、摘要

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還提供了一個熟悉的面向批量或實時查詢和統一平臺。css

達成目標:一、支持HBase多表聯接查詢等較複雜的SQL查詢操做。html

1、基礎環境

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.1html5

2、數據存儲在HBase中,使用Hive執行SQL語句

不管是使用Hive仍是Impala仍是Spark,第一步都是讓他們先知道數據的表結構。
Hive的內置數據類型能夠分爲兩大類:(1)、基礎數據類型;(2)、複雜數據類型。其中,基礎數據類型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。java

Ⅰ、建立Hive外部表

  1. 先有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中的數據。 linux

注意
創建起的Hive表中全部字段均變爲小寫。這同ES-Hive同樣。詳情見:使用Hive或Impala執行SQL語句,對存儲在Elasticsearch中的數據操做android

  1. 先有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中的數據進行正確的查詢操做。css3

  1. Decimal類型數據求和
    SELECT SUM(cdecimal) FROM default.hive_hbase_anqi;
    經驗證,能夠正確的獲得精確的求和值。git

  2. TIMESTAMP類型數據排序
    SELECT * from default.hive_hbase_anqi ORDER BY cdate limit 5;
    經驗證,能夠依據TIMESTAMP值正確排序。github

  3. 普通表與外表關聯
    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寫不是很方便。

3、數據存儲在HBase中,使用Impala執行SQL語句

在Impala中執行INVALIDATE METADATAREFRESH table_name語句即可讓 Impala識別在Hive中新建的或已發生變更的表。

Ⅰ、從HBase讀

Hive中創建的表,impala能夠直接讀取使用。執行復雜SQL語句時,impala明顯比hive快不少。
一樣的,咱們選擇上面(一.2)節中的典型SQL語句進行驗證,Impala-SQL都可以快速正確的返回結果,結果與Hive-SQL執行結果一致。

Ⅱ、向HBase寫

Impala的插入數據SQL語句與Hive相差很大,Impala更接近標準SQL。

  1. 普通添加一行
    insert into hive_hbase_anqi values(0,'1999-09-09',8.88,'name',true);
    經過執行此語句,能夠向HBase中添加一行數據。注意values裏的順序,id首位,其它列按列名稱排序。
  2. 從HBase其餘表導入
    insert into hive_hbase_anqi(id,name,cdate) select id,name,udate from hive_hbase_xi;
    經過執行此語句,能夠向HBase中添加一批從hive_hbase_xi表中取到的數據。

4、綜上所述

數據存儲在HBase中,使用Impala或Hive執行SQL語句進行操做是一個好主意。雖然使用Impala和使用Hive一樣能夠正確執行,但使用Impala比使用Hive更加方便且更高效。目標達成。


做者 @王安琪
個人頭像 aitanjupt@hotmail.com

相關文章
相關標籤/搜索