impala、hive 操作hbase
impala、hive 操作hbase
数据存储在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中创建一个外部表:
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中的数据操作。
2. 先有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依然可以创建表成功。
二、从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外表进行正确的关联。
三、向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 METADATA 、REFRESH table_name语句便可让 Impala识别在Hive中新建的或已发生变动的表。
一、从HBase读
Hive中建立的表,impala可以直接读取使用。执行复杂SQL语句时,impala明显比hive快很多。
同样的,我们选择上面(一.2)节中的典型SQL语句进行验证,Impala-SQL均可以快速正确的返回结果,结果与Hive-SQL执行结果一致。
二、向HBase写
Impala的插入数据SQL语句与Hive相差很大,Impala更接近标准SQL。
- 普通添加一行
insert into hive_hbase_anqi values(0,'1999-09-09',8.88,'name',true);
通过执行此语句,可以向HBase中添加一行数据。注意values里的顺序,id首位,其它列按列名称排序。
- 从HBase其他表导入
insert into hive_hbase_anqi(id,name,cdate) select id,name,udate from hive_hbase_xi;
通过执行此语句,可以向HBase中添加一批从hive_hbase_xi表中取到的数据。
上一篇: Impala中的Invalidate Metadata和Refresh
下一篇: 简单实现栈