[关闭]
@aitanjupt 2015-12-17T10:48:23.000000Z 字数 3655 阅读 8795

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

Hive Impala HBase HiveQL 大数据


〇、摘要

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还提供了一个熟悉的面向批量或实时查询和统一平台。

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

一、基础环境

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.1

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

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

Ⅰ、创建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中创建一个外部表:
  1. CREATE EXTERNAL TABLE default.hive_hbase_anqi(
  2. id BIGINT,
  3. name STRING,
  4. visible BOOLEAN,
  5. cdecimal DECIMAL(12,2),
  6. cdate TIMESTAMP)
  7. ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
  8. STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
  9. WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, angel:name, angel:visible, angel:cdecimal, angel:cdate")
  10. TBLPROPERTIES("hbase.table.name" = "hbaseanqi");

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

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

  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中的数据进行正确的查询操作。

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

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

  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写不是很方便。

三、数据存储在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表中取到的数据。

四、综上所述

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


作者 @王安琪
我的头像
aitanjupt@hotmail.com

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注