Hive集成HBase詳解

摘要
Hive提供了與HBase的集成,使得可以在HBase表上使用HQL語句進行查詢 插入操做以及進行Join和Union等複雜查詢
 
應用場景
1. 將ETL操做的數據存入HBase
2. HBase做爲Hive的數據源
3. 構建低延時的數據倉庫
 
使用
1.從Hive中建立HBase表
  • 使用HQL語句建立一個指向HBase的Hive表
CREATE TABLE hbase_table_1(key int, value string) //Hive中的表名hbase_table_1
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  //指定存儲處理器
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") //聲明列族,列名
TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");  
//hbase.table.name聲明HBase表名,爲可選屬性默認與Hive的表名相同,
//hbase.mapred.output.outputtable指定插入數據時寫入的表,若是之後須要往該表插入數據就須要指定該值
  • 經過HBase shell能夠查看剛剛建立的HBase表的屬性
$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Version: 0.20.3, r902334, Mon Jan 25 13:13:08 PST 2010
hbase(main):001:0> list
xyz                                                                                                           
1 row(s) in 0.0530 seconds
hbase(main):002:0> describe "xyz"
DESCRIPTION                                                           ENABLED                               
  {NAME => 'xyz', FAMILIES => [{NAME => 'cf1', COMPRESSION => 'NONE', VE true                                  
  RSIONS => '3', TTL => '2147483647', BLOCKSIZE => '65536', IN_MEMORY =>                                       
  'false', BLOCKCACHE => 'true'}]}                                                                            
1 row(s) in 0.0220 seconds
hbase(main):003:0> scan "xyz" ROW COLUMN+CELL 0 row(s) in 0.0060 seconds
  • 使用HQL向HBase表中插入數據
INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes WHERE foo=98;
  • 在HBase端查看插入的數據
hbase(main):009:0> scan "xyz"
ROW                          COLUMN+CELL                                                                      
 98                          column=cf1:val, timestamp=1267737987733, value=val_98                            
1 row(s) in 0.0110 seconds
 
2.從Hive中映射HBase
  • 建立一個指向已經存在的HBase表的Hive表
CREATE EXTERNAL TABLE hbase_table_2(key int, value string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "cf1:val")
TBLPROPERTIES("hbase.table.name" = "some_existing_table", "hbase.mapred.output.outputtable" = "some_existing_table");
該Hive表一個外部表,因此刪除該表並不會刪除HBase表中的數據
注意
  1. 建表或映射表的時候若是沒有指定:key則第一個列默認就是行鍵
  2. HBase對應的Hive表中沒有時間戳概念,默認返回的就是最新版本的值
  3. 因爲HBase中沒有數據類型信息,因此在存儲數據的時候都轉化爲String類型
3.多列及多列族的映射
以下表:value1和value2來自列族a對應的b c列,value3來自列族d對應的列
CREATE TABLE hbase_table_1(key int, value1 string, value2 int, value3 int) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,a:b,a:c,d:e"
);
INSERT OVERWRITE TABLE hbase_table_1 SELECT foo, bar, foo+1, foo+2 
FROM pokes WHERE foo=98 OR foo=100;
 
4.Hive Map類型在HBase中的映射規則
以下表:經過Hive的Map數據類型映射HBase表,這樣每行均可以有不一樣的列組合,列名與map中的key對應,列值與map中的value對應
CREATE TABLE hbase_table_1(value map<string,int>, row_key int) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = "cf:,:key"
);
INSERT OVERWRITE TABLE hbase_table_1 SELECT map(bar, foo), foo FROM pokes 
WHERE foo=98 OR foo=100;
cf爲列族,其列名對應map中的bar,列值對應map中的foo
  • 在HBase下查看數據
hbase(main):012:0> scan "hbase_table_1"
ROW                          COLUMN+CELL                                                                      
 100                         column=cf:val_100, timestamp=1267739509194, value=100                            
 98                          column=cf:val_98, timestamp=1267739509194, value=98                              
2 row(s) in 0.0080 seconds
  • 在Hive下查看數據
hive> select * from hbase_table_1;
Total MapReduce jobs = 1
Launching Job 1 out of 1
...
OK
{"val_100":100}    100
{"val_98":98}    98
Time taken: 3.808 seconds
注意:因爲map中的key是做爲HBase的列名使用的,因此map中的key類型必須爲String類型
 
如下映射語句都會報錯
1.
CREATE TABLE hbase_table_1(key int, value map<int,int>) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,cf:"
);
緣由:map中的key必須是String
 
2.
CREATE TABLE hbase_table_1(key int, value string) 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,cf:"
);
緣由:當hbase.columns.mapping中的列族後面爲空時(形如cf:),說明在Hive中其對應的數據類型爲map,而這條語句中對應的是String因此報錯
 
5.Hive還支持簡單的複合行鍵
以下:建立一張指向HBase的Hive表,行鍵有兩個字段,字段之間使用~分隔
CREATE EXTERNAL TABLE delimited_example(key struct<f1:string, f2:string>, value string) 
ROW FORMAT DELIMITED 
COLLECTION ITEMS TERMINATED BY '~' 
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
WITH SERDEPROPERTIES (
  'hbase.columns.mapping'=':key,f:c1');
 
 
6.使用Hive集成HBase表的需注意
  1. 對HBase表進行預分區,增大其MapReduce做業的並行度
  2. 合理的設計rowkey使其儘量的分佈在預先分區好的Region上
  3. 經過set hbase.client.scanner.caching設置合理的掃描緩存

 

參考資料:shell

Hive HBase Integrationapache

 
相關文章
相關標籤/搜索