使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作
https://www.zybuluo.com/aitanjupt/note/209941
- 使用Hive或Impala執(zhí)行SQL語句,對存儲在HBase中的數(shù)據(jù)操作
- 〇、摘要
- 一、基礎(chǔ)環(huán)境
- 二、數(shù)據(jù)存儲在HBase中,使用Hive執(zhí)行SQL語句
- Ⅰ、創(chuàng)建Hive外部表
- Ⅱ、從HBase讀
- Ⅲ、向HBase寫
- 三、數(shù)據(jù)存儲在HBase中,使用Impala執(zhí)行SQL語句
- Ⅰ、從HBase讀
- Ⅱ、向HBase寫
- 四、綜上所述
?
〇、摘要
Hive是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供簡單的SQL查詢功能,可以將SQL語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行。?
HBase(Hadoop Database),是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),只能通過Rowkey來取數(shù)據(jù),無法進(jìn)行SQL查詢。?
因此如果Hive可以從HBase中取數(shù)據(jù),并結(jié)合Hive的SQL查詢功能,便能做到較為復(fù)雜的SQL查詢操作。?
Impala對存儲在HDFS、HBase的數(shù)據(jù)提供直接查詢互動的SQL。除了像Hive使用相同的統(tǒng)一存儲平臺,Impala也使用相同的元數(shù)據(jù),SQL語法(Hive SQL),ODBC驅(qū)動程序和用戶界面(Hue Beeswax)。Impala還提供了一個熟悉的面向批量或?qū)崟r查詢和統(tǒng)一平臺。
達(dá)成目標(biāo):1、支持HBase多表聯(lián)接查詢等較復(fù)雜的SQL查詢操作。
一、基礎(chǔ)環(huán)境
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
二、數(shù)據(jù)存儲在HBase中,使用Hive執(zhí)行SQL語句
無論是使用Hive還是Impala還是Spark,第一步都是讓他們先知道數(shù)據(jù)的表結(jié)構(gòu)。?
Hive的內(nèi)置數(shù)據(jù)類型可以分為兩大類:(1)、基礎(chǔ)數(shù)據(jù)類型;(2)、復(fù)雜數(shù)據(jù)類型。其中,基礎(chǔ)數(shù)據(jù)類型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
Ⅰ、創(chuàng)建Hive外部表
在HBase中已經(jīng)存在一個名為hbaseanqi的表,表中一列族名為angel,列族中存在五列:name、visible、cdecimal、cdate、position。?
需要在Hive中創(chuàng)建一個名為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為列族名)。?
那么執(zhí)行以下語句,在Hive中創(chuàng)建一個外部表:
可以看到,語句中通過WITH SERDEPROPERTIES指定了Hive與HBase的列映射關(guān)系。通過以上語句,在Hive中可以看到結(jié)構(gòu)正確的表,并可以在Hue中看到HBase中的數(shù)據(jù)。
注意:?
建立起的Hive表中所有字段均變?yōu)樾憽_@同ES-Hive一樣。詳情見:使用Hive或Impala執(zhí)行SQL語句,對存儲在Elasticsearch中的數(shù)據(jù)操作。
因?yàn)樵贖ive中執(zhí)行上面語句時,Hive需要去HBase中獲取一些信息,若是HBase中并無相關(guān)表,執(zhí)行以上語句直接拋出異常:HBase table hbaseanqi doesn't exist while the table is declared as an external table。?
因此在無HBase表的情況下,并不能創(chuàng)建Hive對應(yīng)表。?
這與ElasticSearch和Hive建立關(guān)聯(lián)時的情況不一樣。當(dāng)在ElasticSearch并無相應(yīng)index-type(索引-類型)時,Hive依然可以創(chuàng)建表成功。具體詳情可以查看:使用Hive或Impala執(zhí)行SQL語句,對存儲在Elasticsearch中的數(shù)據(jù)操作?一文。
Ⅱ、從HBase讀
我們選擇以下幾條有代表性的SQL查詢語句,來驗(yàn)證使用Hive可以對存儲在HBase中的數(shù)據(jù)進(jìn)行正確的查詢操作。
Decimal類型數(shù)據(jù)求和?
SELECT SUM(cdecimal) FROM default.hive_hbase_anqi;?
經(jīng)驗(yàn)證,可以正確的得到精確的求和值。
TIMESTAMP類型數(shù)據(jù)排序?
SELECT * from default.hive_hbase_anqi ORDER BY cdate limit 5;?
經(jīng)驗(yàn)證,可以依據(jù)TIMESTAMP值正確排序。
普通表與外表關(guān)聯(lián)?
select * from hive_hbase_anqi,sample_08 WHERE hive_hbase_anqi.id=sample_08.salary;?
其中sample_08表是Hive普通表,hive_hbase_anqi是數(shù)據(jù)存儲在HBase中的Hive外表。?
經(jīng)驗(yàn)證,通過執(zhí)行上面語句,可以將Hive普通表與Hive的HBase外表進(jìn)行正確的關(guān)聯(lián)。
Ⅲ、向HBase寫
insert OVERWRITE table hive_hbase_anqi select salary,dtime,sdecimal,sname,svisible from sample_09;?
將Hive普通表sample_09中的數(shù)據(jù)導(dǎo)入Hive外部表anqi中,去HBase中查看,可以看到數(shù)據(jù)被正確導(dǎo)入。?
Hive四種數(shù)據(jù)導(dǎo)入方式:從本地文件系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表;從HDFS上導(dǎo)入數(shù)據(jù)到Hive表;從別的表中查詢出相應(yīng)的數(shù)據(jù)并導(dǎo)入到Hive表中;在創(chuàng)建表的時候通過從別的表中查詢出相應(yīng)的記錄并插入到所創(chuàng)建的表中。?
向HBase寫不是很方便。
三、數(shù)據(jù)存儲在HBase中,使用Impala執(zhí)行SQL語句
在Impala中執(zhí)行INVALIDATE METADATA?、REFRESH table_name語句便可讓 Impala識別在Hive中新建的或已發(fā)生變動的表。
Ⅰ、從HBase讀
Hive中建立的表,impala可以直接讀取使用。執(zhí)行復(fù)雜SQL語句時,impala明顯比hive快很多。?
同樣的,我們選擇上面(一.2)節(jié)中的典型SQL語句進(jìn)行驗(yàn)證,Impala-SQL均可以快速正確的返回結(jié)果,結(jié)果與Hive-SQL執(zhí)行結(jié)果一致。
Ⅱ、向HBase寫
Impala的插入數(shù)據(jù)SQL語句與Hive相差很大,Impala更接近標(biāo)準(zhǔn)SQL。
insert into hive_hbase_anqi values(0,'1999-09-09',8.88,'name',true);?
通過執(zhí)行此語句,可以向HBase中添加一行數(shù)據(jù)。注意values里的順序,id首位,其它列按列名稱排序。
insert into hive_hbase_anqi(id,name,cdate) select id,name,udate from hive_hbase_xi;?
通過執(zhí)行此語句,可以向HBase中添加一批從hive_hbase_xi表中取到的數(shù)據(jù)。
四、綜上所述
數(shù)據(jù)存儲在HBase中,使用Impala或Hive執(zhí)行SQL語句進(jìn)行操作是一個好主意。雖然使用Impala和使用Hive同樣可以正確執(zhí)行,但使用Impala比使用Hive更加方便且更高效。目標(biāo)達(dá)成。
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/articles/9253438.html
總結(jié)
以上是生活随笔為你收集整理的使用Hive或Impala执行SQL语句,对存储在HBase中的数据操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运满满的技术架构演进之路
- 下一篇: 携程开源Redis多数据中心解决方案-X