大数据学习日志——hbase与hive整合

Hive 1.x将与HBase 0.98.x及更低版本保持兼容,Hive 2.x将与HBase 1.x及更高版本兼容 ,其实直接使用cdh版本就好

        如果说版本之间并不兼容,可以尝试编译hive或hbase–》会编译hive
        将hbase的表数据映射到hive表中,在hive对数据进行分析、计算
        数据还是存在hbase的
        hive和hbase之间进行关联,依赖于hive-hbase-handler-1.2.1.jar(注意版本)

首先在hive的hive-site.xml中添加:(注意修改为自己的主机名和hbase-site.xml中是一样的)

<property> 
    <name>hbase.zookeeper.quorum</name> 
    <value>localhost</value> 
</property> 

 

第一种创建情况

在hive和hbase都没有数据的情况下,创建hive表,并基于hbase存取

CREATE TABLE hive2hbase_table( 
a int, 
b int, 
c string, 
d string, 
e string, 
) 
STORED BY \'org.apache.hadoop.hive.hbase.HBaseStorageHandler\' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:b,info:c,info:d,info:e”) 
TBLPROPERTIES ("hbase.table.name" = "hive2hbase_table");

基本格式如上

存储时候需要org.apache.hadoop.hive.hbase.HBaseStorageHandler,注意hive中有加载上述中相关jar包

字段映射格式也是固定形式,重点:第一个字段是hbase中的rowkey,在映射中第一个字段用:key表示,然后根据顺序将建表字段和hbase的列进行一一映射。

 

基于hbase的hive表不能通过以下方式将数据加载到hive表中

load data inpath \'xxxx\' into table hive2hbase_table; 

即不能通过load文件写入hive表中。只能通过查询已经存在的表然后结合insert进行数据的导入 

insert into table hive2hbase_table select * from temp_table; 

创建完成后若要直接查询hbase数据需要手动flush,因为数据还在memstore中

 

第二种创建情况

创建hbase在hive中的映射表(hbase中已经有一张表) , 映射hbase表数据,hive中创建的表必须是外部表,并且hbase中的rowkey必须要映射到hive中

create external table hbase2hive_table( 
a int, 
b string, 
c int 
) 
STORED BY \'org.apache.hadoop.hive.hbase.HBaseStorageHandler\' 
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:b,info:c") 
TBLPROPERTIES ("hbase.table.name" = "hbase2hive_table"); 

注意创建时候,在建立hbase列和hive字段映射时,hbase是不需要写出rowkey,在第一种情况中需要多些:key,此时不需要,但是任然需要在hive中设置一个主键,即建表语句创建字段的第一个字段,默认为主键;其余字段与hbase列按顺序一一对应。

 

集成的原因和目的: 
        HBase自身的查询非常有限,仅支持有限的scan get,做不了聚合查询(max avg min max),也做不了分组 联合(jion) 子查询等 
        但是Hive是支持的,非常友好,非常强大,只是Hive存储不占优势 
        可以将数据保存到HBase,但是可以通过hive映射表,使用hql做一些丰富查询 
        缺点: 
        此时虽然查询功能丰富了,但是底层的执行依然是mapredcue,会比较的慢,失去了hbase快速查询的优势

集成之后的好处:

        数据在hbase中保存,意味着表中的数据在hbase中是可以任意修改的,hive1.4才有支持update

删除操作:
       1.如果是hive映射到habse
       删除hive中的表,对应hhbase中的会一起被删除
       2.如是hbase映射hive    删除hive中的表,是不会影响hbase中的表,这种情况意味着只是hive在habse对应的表中做了一个映射关系而已

在实际操作中有如上所属的使用场景,大量数据存储在hbase中,但是要对数据进行处理时,并不友好,这时候可以将hbase数据映射到hive中,进行sql查询,得到结果以后,便可将hive表给删除。

版权声明:本文为SaltFishYe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/SaltFishYe/p/10467085.html