大数据学习日志——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表给删除。