[一起学Hive]之十三-Hive整合HBase,操作HBase表
2016-05-06 10:38
387 查看
十二、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 SQL的优化
- iOS WebRTC
- Android快速实现微信支付(真的!很快!)
- UIRectEdgeNone
- android安全——Activity劫持的防范程序
- 知识普及:彻底弄懂css中单位px和em,rem的区别
- MP 新版本 [2 mysql sequelize 搭建数据库]
- LNMP3台主机分离进行部署
- 表单实现表单自动生成工厂
- C++作业5
- 第十一周项目1-点-圆-圆柱类族的设计(3)
- CAS学习
- C++ 模板
- 设计模式C++学习笔记之十六(Observer观察者模式)
- c++第五次作业
- java中根据hibernate配置文件自动建表
- iOS之修改项目BUG之旅--(三)
- [一起学Hive]之十一-Hive中Join的类型和用法
- 分页存储管理方式
- MVVM代码重构规范