[一起學Hive]之十三-Hive整合HBase,操作HBase表


關鍵字:Hive整合HBase、Hive操作HBase表

十二、Hive整合HBase,操作HBase表

HBase是被設計用來做k-v查詢的,但有時候,也會遇到基於HBase表的復雜統計,寫MR很不方便。Hive考慮到了這點,提供了操作HBase表的接口。

關於Hive操作HBase表的原理,請參考我之前的博文:

         http://lxw1234.com/archives/2015/04/101.htm

值得商榷的是,使用Hive操作HBase中的表,只是提供了便捷性,對於性能上,較MapReduce並不會提升太多,請大家酌情使用。

下面來看使用方法(基於Hive0.13和HBase0.96):

12.1 HBase中的表

先在HBase中創建表:

  1. create 'lxw1234',{NAME => 'f1',VERSIONS => 1},{NAME => 'f2',VERSIONS => 1},
  2. {NAME => 'f3',VERSIONS => 1}

表’lxw1234’有三個列族f1,f2,f3

向HBase表中插入數據:

  1. put 'lxw1234','lxw1234.com','f1:c1','name1'
  2. put 'lxw1234','lxw1234.com','f1:c2','name2'
  3. put 'lxw1234','lxw1234.com','f2:c1','age1'
  4. put 'lxw1234','lxw1234.com','f2:c2','age2'
  5. put 'lxw1234','lxw1234.com','f3:c1','job1'
  6. put 'lxw1234','lxw1234.com','f3:c2','job2'
  7. put 'lxw1234','lxw1234.com','f3:c3','job3'

完成后數據如下:

  1. hbase(main):025:0* scan 'lxw1234'
  2. ROW COLUMN+CELL
  3. lxw1234.com column=f1:c1, timestamp=1435624625198, value=name1
  4. lxw1234.com column=f1:c2, timestamp=1435624591717, value=name2
  5. lxw1234.com column=f2:c1, timestamp=1435624608759, value=age1
  6. lxw1234.com column=f2:c2, timestamp=1435624635261, value=age2
  7. lxw1234.com column=f3:c1, timestamp=1435624662282, value=job1
  8. lxw1234.com column=f3:c2, timestamp=1435624697028, value=job2
  9. lxw1234.com column=f3:c3, timestamp=1435624697065, value=job3
  10. 1 row(s) in 0.0350 seconds

12.2 Hive中創建基於HBase的表

在Hive中使用如下語句建表:

  1. SET hbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3;
  2. SET zookeeper.znode.parent=/hbase;
  3. ADD jar /usr/local/apache-hive-0.13.1-bin/lib/hive-hbase-handler-0.13.1.jar;
  4.  
  5. CREATE EXTERNAL TABLE lxw1234 (
  6. rowkey string,
  7. f1 map<STRING,STRING>,
  8. f2 map<STRING,STRING>,
  9. f3 map<STRING,STRING>
  10. ) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  11. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")
  12. TBLPROPERTIES ("hbase.table.name" = "lxw1234");

這里使用外部表映射到HBase中的表,這樣,在Hive中刪除表,並不會刪除HBase中的表,否則,就會刪除。

另外,除了rowkey,其他三個字段使用Map結構來保存HBase中的每一個列族。

其中,參數解釋如下:

  • hbase.zookeeper.quorum:

指定HBase使用的zookeeper集群,默認端口是2181,可以不指定,如果指定,格式為zkNode1:2222,zkNode2:2222,zkNode3:2222

  • zookeeper.znode.parent

指定HBase在zookeeper中使用的根目錄

  • hbase.columns.mapping

Hive表和HBase表的字段映射關系,分別為:Hive表中第一個字段映射:key(rowkey),第二個字段映射列族f1,第三個字段映射列族f2,第四個字段映射列族f3

  • hbase.table.name

HBase中表的名字

         也可以直接在Hive中創建表的同時,完成在HBase中創建表

加入之前沒有在HBase中創建表lxw1234,那么使用上面的語句在Hive創建表的時候,會同時在HBase中創建。

12.3 Hive中查詢HBase表

上面在Hive中創建好表之后,直接查詢:

  1. hive> select * from lxw1234;
  2. OK
  3. lxw1234.com {"c1":"name1","c2":"name2"} {"c1":"age1","c2":"age2"} {"c1":"job1","c2":"job2","c3":"job3"}

 

可以看到,Hive中只有一行數據,因為只有一個rowkey,每一個列族的列和值,分別被存儲到Map結構中。

12.4 Hive中插入數據到HBase表

可以在Hive表中通過Insert語句,完成對HBase表數據的插入。

比如,執行下面的語句:

  1. INSERT INTO TABLE lxw1234
  2. SELECT 'row1' AS rowkey,
  3. map('c3','name3') AS f1,
  4. map('c3','age3') AS f2,
  5. map('c4','job3') AS f3
  6. FROM DUAL
  7. limit 1;

在HBase中查看數據:

  1. hbase(main):028:0* scan 'lxw1234'
  2. ROW COLUMN+CELL
  3. lxw1234.com column=f1:c1, timestamp=1435624625198, value=name1
  4. lxw1234.com column=f1:c2, timestamp=1435624591717, value=name2
  5. lxw1234.com column=f2:c1, timestamp=1435624608759, value=age1
  6. lxw1234.com column=f2:c2, timestamp=1435624635261, value=age2
  7. lxw1234.com column=f3:c1, timestamp=1435624662282, value=job1
  8. lxw1234.com column=f3:c2, timestamp=1435624697028, value=job2
  9. lxw1234.com column=f3:c3, timestamp=1435624697065, value=job3
  10. row1 column=f1:c3, timestamp=1435625971410, value=name3
  11. row1 column=f2:c3, timestamp=1435625971410, value=age3
  12. row1 column=f3:c4, timestamp=1435625971410, value=job3
  13. 2 row(s) in 0.0420 seconds

Hive中的外部表lxw1234,就和其他外部表一樣,只有一份元數據,真正的數據是在HBase表中,Hive通過hive-hbase-handler來操作HBase中的表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM