使用Hive或Impala执行SQL语句,对存储在HBase中的数据操做

使用Hive或Impala执行SQL语句,对存储在HBase中的数据操做

Hive Impala HBase HiveQL 大数据javascript


 

〇、摘要

Hive是基于Hadoop的一个数据仓库工具,能够将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,能够将SQL语句转换为MapReduce任务进行运行。
HBase(Hadoop Database),是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,只能经过Rowkey来取数据,没法进行SQL查询。
所以若是Hive能够从HBase中取数据,并结合Hive的SQL查询功能,便能作到较为复杂的SQL查询操做。
Impala对存储在HDFS、HBase的数据提供直接查询互动的SQL。除了像Hive使用相同的统一存储平台,Impala也使用相同的元数据,SQL语法(Hive SQL),ODBC驱动程序和用户界面(Hue Beeswax)。Impala还提供了一个熟悉的面向批量或实时查询和统一平台。css

达成目标:一、支持HBase多表联接查询等较复杂的SQL查询操做。html

1、基础环境

CentOS-6.5
JDK-1.7
hive:hive-0.13.1+cdh5.3.6+397,impala:impala-2.1.5+cdh5.3.6+0,spark:spark-1.2.0+cdh5.3.6+379,
elasticsearch:elasticsearch-1.7.1,elasticsearch-hadoop-hive:elasticsearch-hadoop-hive-2.1.1html5

2、数据存储在HBase中,使用Hive执行SQL语句

不管是使用Hive仍是Impala仍是Spark,第一步都是让他们先知道数据的表结构。
Hive的内置数据类型能够分为两大类:(1)、基础数据类型;(2)、复杂数据类型。其中,基础数据类型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。java

Ⅰ、建立Hive外部表

  1. 先有HBase再有Hive
    在HBase中已经存在一个名为hbaseanqi的表,表中一列族名为angel,列族中存在五列:name、visible、cdecimal、cdate、position。
    须要在Hive中建立一个名为anqi的表,其中表中存在五列:BIGINT型的id、STRING型的name、BOOLEAN型的visible、DECIMAL(12,2)型的cdecimal、TIMESTAMP型的cdate。
    Hive中anqi表的id、name、visible、cdecimal和列cdate分别来自于HBase中hbaseanqi表的Rowkey及angel:name、angel:visible、angel:cDecimal、angel:cdate列(angel为列族名)。
    那么执行如下语句,在Hive中建立一个外部表:
  
  
  
  
CREATE EXTERNAL TABLE default.hive_hbase_anqi( id BIGINT, name STRING, visible BOOLEAN, cdecimal DECIMAL(12,2), cdate TIMESTAMP) ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, angel:name, angel:visible, angel:cdecimal, angel:cdate") TBLPROPERTIES("hbase.table.name" = "hbaseanqi");

能够看到,语句中经过WITH SERDEPROPERTIES指定了Hive与HBase的列映射关系。经过以上语句,在Hive中能够看到结构正确的表,并能够在Hue中看到HBase中的数据。 linux

注意
创建起的Hive表中全部字段均变为小写。这同ES-Hive同样。详情见:使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操做android

  1. 先有Hive再有HBase
    由于在Hive中执行上面语句时,Hive须要去HBase中获取一些信息,如果HBase中并没有相关表,执行以上语句直接抛出异常:HBase table hbaseanqi doesn't exist while the table is declared as an external table。
    所以在无HBase表的状况下,并不能建立Hive对应表。
    这与ElasticSearch和Hive创建关联时的状况不同。当在ElasticSearch并没有相应index-type(索引-类型)时,Hive依然能够建立表成功。具体详情能够查看:使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操做 一文。

Ⅱ、从HBase读

咱们选择如下几条有表明性的SQL查询语句,来验证使用Hive能够对存储在HBase中的数据进行正确的查询操做。css3

  1. Decimal类型数据求和
    SELECT SUM(cdecimal) FROM default.hive_hbase_anqi;
    经验证,能够正确的获得精确的求和值。git

  2. TIMESTAMP类型数据排序
    SELECT * from default.hive_hbase_anqi ORDER BY cdate limit 5;
    经验证,能够依据TIMESTAMP值正确排序。github

  3. 普通表与外表关联
    select * from hive_hbase_anqi,sample_08 WHERE hive_hbase_anqi.id=sample_08.salary;
    其中sample_08表是Hive普通表,hive_hbase_anqi是数据存储在HBase中的Hive外表。
    经验证,经过执行上面语句,能够将Hive普通表与Hive的HBase外表进行正确的关联。

Ⅲ、向HBase写

insert OVERWRITE table hive_hbase_anqi select salary,dtime,sdecimal,sname,svisible from sample_09;
将Hive普通表sample_09中的数据导入Hive外部表anqi中,去HBase中查看,能够看到数据被正确导入。
Hive四种数据导入方式:从本地文件系统中导入数据到Hive表;从HDFS上导入数据到Hive表;从别的表中查询出相应的数据并导入到Hive表中;在建立表的时候经过从别的表中查询出相应的记录并插入到所建立的表中。
向HBase写不是很方便。

3、数据存储在HBase中,使用Impala执行SQL语句

在Impala中执行INVALIDATE METADATAREFRESH table_name语句即可让 Impala识别在Hive中新建的或已发生变更的表。

Ⅰ、从HBase读

Hive中创建的表,impala能够直接读取使用。执行复杂SQL语句时,impala明显比hive快不少。
一样的,咱们选择上面(一.2)节中的典型SQL语句进行验证,Impala-SQL都可以快速正确的返回结果,结果与Hive-SQL执行结果一致。

Ⅱ、向HBase写

Impala的插入数据SQL语句与Hive相差很大,Impala更接近标准SQL。

  1. 普通添加一行
    insert into hive_hbase_anqi values(0,'1999-09-09',8.88,'name',true);
    经过执行此语句,能够向HBase中添加一行数据。注意values里的顺序,id首位,其它列按列名称排序。
  2. 从HBase其余表导入
    insert into hive_hbase_anqi(id,name,cdate) select id,name,udate from hive_hbase_xi;
    经过执行此语句,能够向HBase中添加一批从hive_hbase_xi表中取到的数据。

4、综上所述

数据存储在HBase中,使用Impala或Hive执行SQL语句进行操做是一个好主意。虽然使用Impala和使用Hive一样能够正确执行,但使用Impala比使用Hive更加方便且更高效。目标达成。


做者 @王安琪
个人头像 aitanjupt@hotmail.com

相关文章
相关标签/搜索