Impala
提供对HDFS,HBASE数据的高性能,低延迟的交互式sql查询功能
基于HIVE,使用内存计算,具有实时,批处理,多并发特点
是处理pb级大数据实时查询分析引擎
优点:
基于内存运算,不需要把中间结果写入磁盘,省掉大量I/O开销
无需转换为MR,直接访问hdfs,hbase的数据进行调度
使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。
支持各种文件格式,如TEXTFILE?、SEQUENCEFILE 、RCFile、Parquet。
可以访问hive的metastore,对hive数据直接做数据分析。
缺点
1)对内存的依赖大,且完全依赖于hive。
2)实践中,分区超过1万,性能严重下降。
3)只能读取文本文件,而不能直接读取自定义二进制文件。
4)每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。
impala的sql语句:
建立外部表:(数据存储在hdfs上,location指定的是数据文件的目录名)
create external table tb1
(id int,name string)
row format delimited fields terminated by ‘,’ //每个记录都是 “,”分割的
STORED AS PARQUET
LOCATION ‘hdfs://ip:8020/encdata/impala/storage/originald/order2’ //表的储存位置
建立分区表
create table tb1
(id int,name string)
partitioned by (age int,id int) //分区字段唯一
STORED AS PARQUET
LOCATION ‘hdfs://ip:8020/encdata/impala/storage/originald/order2’
插入数据进入分区
静态分区:(每插入一条数据产生一个文件,容易造成hdfs的块不够,导致namenode挂掉)
insert into tableName partition(year = ‘2013’,month=‘12’) values(‘foo’,‘foo’) //后面两值代表插入表中的字段
动态分区:
insert into tableName partition(year) select id ,year from tmpTable // 查询的字段要与目标的字段顺序一致,分区字段要放在查询字段的最后,如果有多个分区字段,则按partition()中的顺序排好
修改表名
alter table old_name rename to new_name
修改数据文件的存储位置
alter table tableName set location ‘hdfs_directory’
修改列
alter table tableName add columns(column_defs) //增加列
alter table tableName replace columns(column_defs) //替换列
alter table tableName dropcolumns(column_defs) //删除列
alter table tableName change column_name new name new spec //换列名、
加载数据进入表中
load data inpath ‘/usr/encdata11.txt’ into table //加载的数据文件是在hdfs上的
更新元数据信息(元数据存储在HIVE中)
invalidate metadata
查询impala的版本:select version()
Impala不支持delete和update操作
Impala支持的数据类型: 可以利用cast进行数据类型的转换 cast(‘111’ as int)
BIGINT/SMALLINT/INT
BOOLEAN
DOUBLE/REAL
FLOAT
STRING
TIMESTAMP
hadoop高可用下的impala建表