微信搜索lxw1234bigdata | 邀请体验:数阅–数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

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

Hive lxw1234@qq.com 40566℃ 6评论

关键字: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中创建表:

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

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

向HBase表中插入数据:

put 'lxw1234','lxw1234.com','f1:c1','name1'
put 'lxw1234','lxw1234.com','f1:c2','name2'
put 'lxw1234','lxw1234.com','f2:c1','age1'
put 'lxw1234','lxw1234.com','f2:c2','age2'
put 'lxw1234','lxw1234.com','f3:c1','job1'
put 'lxw1234','lxw1234.com','f3:c2','job2'
put 'lxw1234','lxw1234.com','f3:c3','job3'

完成后数据如下:

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

12.2 Hive中创建基于HBase的表

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

SET hbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3; 
SET zookeeper.znode.parent=/hbase;
ADD jar /usr/local/apache-hive-0.13.1-bin/lib/hive-hbase-handler-0.13.1.jar;

CREATE EXTERNAL TABLE lxw1234 (
rowkey string,
f1 map<STRING,STRING>,
f2 map<STRING,STRING>,
f3 map<STRING,STRING>
) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")
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中创建好表之后,直接查询:

hive> select * from lxw1234;
OK
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表数据的插入。

比如,执行下面的语句:

INSERT INTO TABLE lxw1234 
SELECT 'row1' AS rowkey,
map('c3','name3') AS f1,
map('c3','age3') AS f2,
map('c4','job3') AS f3 
FROM DUAL 
limit 1;

在HBase中查看数据:

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

Hive中的外部表lxw1234,就和其他外部表一样,只有一份元数据,真正的数据是在HBase表中,Hive通过hive-hbase-handler来操作HBase中的表。

 

Hive相关文章(持续更新)

一起学Hive系列

—-Hive概述,Hive是什么

—-Hive函数大全-完整版

—-Hive中的数据库(Database)和表(Table)

—-Hive的安装配置

—-Hive的视图和分区

—-Hive的动态分区

—-向Hive表中加载数据

—-使用Hive命令行

—-Hive的查询语句SELECT

—-Hive中Join的原理和机制

—-Hive中Join的类型和用法

—-Hive SQL的优化

Hive分析函数系列

Hive索引

hive优化之——控制hive任务中的map数和reduce数

 

如果觉得本博客对您有帮助,请 赞助作者

转载请注明:lxw的大数据田地 » [一起学Hive]之十三-Hive整合HBase,操作HBase表

喜欢 (17)
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(6)个小伙伴在吐槽
  1. 用beeline 有没有问题?
    lengfo2016-04-18 01:12 回复
  2. 为啥最后一步不成功,没有找到lxw1234
    小小2016-05-13 17:06 回复
  3. 请问,有没有使用过 通过 hive insert 把数据导入hbase,效率怎样,看到网上介绍性能不高,还没测过
    maybe2016-06-23 00:22 回复
  4. select * from lxw1234;java.io.IOException:java.io.IOException: The connection has to be unmanaged 报错啊
    hello2016-07-22 14:00 回复
    • 我也是这个错,请问你解决了吗?可以加微信一起交流下吗?jf66108543
      jf661085432017-11-04 21:00 回复
  5. select * from lxw1234;java.io.IOException:java.io.IOException: The connection has to be unmanaged 报错啊
    jf661085432017-11-04 21:09 回复