@aitanjupt
2015-12-17T10:48:23.000000Z
字数 3655
阅读 8853
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
无论是使用Hive还是Impala还是Spark,第一步都是让他们先知道数据的表结构。
Hive的内置数据类型可以分为两大类:(1)、基础数据类型;(2)、复杂数据类型。其中,基础数据类型包括:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING、BINARY、TIMESTAMP、DECIMAL、CHAR、VARCHAR、DATE。
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中的数据。
注意:
建立起的Hive表中所有字段均变为小写。这同ES-Hive一样。详情见:使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作。
我们选择以下几条有代表性的SQL查询语句,来验证使用Hive可以对存储在HBase中的数据进行正确的查询操作。
Decimal类型数据求和
SELECT SUM(cdecimal) FROM default.hive_hbase_anqi;
经验证,可以正确的得到精确的求和值。
TIMESTAMP类型数据排序
SELECT * from default.hive_hbase_anqi ORDER BY cdate limit 5;
经验证,可以依据TIMESTAMP值正确排序。
普通表与外表关联
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外表进行正确的关联。
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写不是很方便。
在Impala中执行INVALIDATE METADATA
、REFRESH table_name
语句便可让 Impala识别在Hive中新建的或已发生变动的表。
Hive中建立的表,impala可以直接读取使用。执行复杂SQL语句时,impala明显比hive快很多。
同样的,我们选择上面(一.2)节中的典型SQL语句进行验证,Impala-SQL均可以快速正确的返回结果,结果与Hive-SQL执行结果一致。
Impala的插入数据SQL语句与Hive相差很大,Impala更接近标准SQL。
insert into hive_hbase_anqi values(0,'1999-09-09',8.88,'name',true);
insert into hive_hbase_anqi(id,name,cdate) select id,name,udate from hive_hbase_xi;
数据存储在HBase中,使用Impala或Hive执行SQL语句进行操作是一个好主意。虽然使用Impala和使用Hive同样可以正确执行,但使用Impala比使用Hive更加方便且更高效。目标达成。
作者 @王安琪
aitanjupt@hotmail.com