Hive的特点是查询效率块,但是不易插入和修改;Hbase的特点是方便对大量的数据进行处理,所以为了提高我们的工作效率,把二者结合起来使用。
Hive与Hbase继承使用场景
- 将Hbase作为Hive的数据源,让Hbase支持类SQL操作;
- 将Hive ETL数据存入HBase,便于快速查询;
- 构建低延时的数据仓库。利用HBase的快速读写能力,实现数据实时查询。
Hive与HBase的集成原理
通过二者本身对外的API接口互相通信完成
由Hive的lib目录中hive-hbase-handler-*.jar工具类实现。
HBaseStorageHandler
实现Hive与HBase集成的类
对HiveStorageHandler接口的实现
代码实现
我们以下面的一些数据为例来做演示:
我们要实现的是Hive与Hbase的交互,那么创建的表肯定在满足Hive格式的同时也要满足Hbase的格式。我们把emp_id设为rowkey,emp_name/job_title/company把这三列归为一个列簇,start_date和quit_date归为一个列簇。
首先需要在Hbase中创建一个表格:
create 'emp_basic',{NAME=>'emp'},{NAME=>'time'}
然后在Hive中创建一个外部表:
create external table emp_basic(
emp_id string,
emp_name string,
job_title string,
company string,
start_date string,
quit_date string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties
('hbase.columns.mapping'=':key,emp:name,emp:job_title,emp:company,time:sDate,time:eDate')
tblproperties('hbase.table.name'='emp_basic');
:key指的是rowkey,后面分别为对应的列簇和列。
‘hbase.table.name’='emp_basic’为对应Hbase上的表名。
接下来我们插入数据。插入数据当然是要选择插入速度更快的Hbase来实现。
1、把文件上传到hdfs
hdfs dfs -put /test/emp_basic.csv /data/emp
2、把文件从hdfs导入到hbase
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=',' -Dimporttsv.columns='HBASE_ROW_KEY,emp:name,emp:job_title,emp:company,time:sDate,time:eDate' 'emp_basic' /data/emp/emp_basic.csv
3.导入成功后,在Hbase或者Hive中查询数据信息:
Hbase:
get 'emp_basic','1'
Hbase所展现的信息其实并不方便我们的查看,这也是需要借助Hive的一个重要原因。实际上,Hbase原本就是为Hive而产生的。
Hive中查看:
select * from emp_basic;
此时Hive和Hbase的关联就成功了。我们可以通过Hbase来实现数据的增删改,用Hive实现数据的快速查询。