優雅的將hbase的數據導入hive表
背景
Hive是一個構建在Hadoop基礎設施之上的數據倉庫。通過Hive可以使用HQL語言查詢存放在HDFS上的數據。HQL是一種類SQL語言,這種語言最終被轉化為Map/Reduce.
HBase是一種Key/Value系統,它運行在HDFS之上。和Hive不一樣,Hbase的能夠在它的數據庫上實時運行,而不是運行MapReduce任務。
hive幫助熟悉SQL的人運行MapReduce任務。因為它是JDBC兼容的,同時,它也能夠和現存的SQL工具整合在一起。HBase通過存儲key/value來工作。它支持四種主要的操作:增加或者更新行,查看一個范圍內的cell,獲取指定的行,刪除指定的行、列或者是列的版本。
由於hive目前不支持更新操作(非實時性)。所以在生產環境上不能直接將數據寫入hive表,一般都是先將數據寫到hbase上,而在大數據的計算及統計的時候,hive的讀寫速率大大優於hbase表,在處理大數據時(幾TB的數據量),將會大大的提高挖掘的效率。
所以,比較常規的做法都是在生產環境下,將數據寫入hbase表,再在數據挖掘的時候,將數據導入hive表,進行數據分析統計操作。
那怎么將數據從hbase表轉入hive表里面呢,本文將介紹以下幾種辦法。
轉換
將hbase的數據轉換成hive,筆者知道的就有以下幾種轉換方式,下面一一道來。
創建hive外部關聯表
在創建hive表的時候,指定與hbase某個表做為關聯,如下所示的建表語句:
| CREATE TABLE hive_table_hbase(key int, value1 string, value2 int, value3 int) TBLPROPERTIES("hbase.table.name" = "some_existing_table");; |
上面的語句翻譯為:創建一個hive_table_hbase為名稱的hive表,與hbase的some_existing_table表作關聯,具體關聯方式為字段對應:
| hive_table_hbas |
some_existing_table |
| key |
:key |
| value1 |
a:b |
| value2 |
a:c |
| value3 |
d:e |
此種關聯的好處是,將hbase與hive實時關聯,hbase只要有數據更新,hive表當然就有了更新,不過要說明的時,此時,hive並沒有分配空間去存儲數據,僅僅只是做了一個映射。當然了,在使用大數據分析的時候,效率是很不好的。
從hbase將數據導入hive
此種實現思路是將hbase表的數據轉成RDD(可查看上篇文章)模型,在將RDD轉成DataFrame模型,注冊Shark臨時表,在就數據一次從臨時表中,導入到hive表中
如下所示![]()
<![endif]>
<![if !vml]>
<![endif]>
<![ !>
<!<![if !vml]>
<>
![f
<!![]()
此種轉換,只是在hbase表數據導入到hive表的時候,會花費一定時間,但為后面的密集的hive表查詢,大大增加了效率。
結論
在數據量比較小的時候,比如只有10幾個G以下時,第一種效率比較高,因為沒有轉換的時間,當數據量超過10幾個G后,且后續需要很密集的查詢,當然要選第二種轉換方式,一次轉換,終生無憂!!

極點科技
誠信 專注 創新
