Impala shell
外部命令
impala-shell执行时可加参数
- -h(--help)
- -v(--version)
- -V(--verbose) 默认使用的就是这个
- --quiet 关闭详细输出
- -p 显示执行计划
- -i hostname(--impalad=hostname:port) 指定连接主机,host默认是本机,port默认是21000
- -r(--refresh_after_connect) 刷新所有元数据,impala-shell启动完成后立刻会执行这个命令,全量刷新元数据
- -q query(--query=query) 从命令行查询,不进入impala-shell
- -d default_db(--database=default_db) 指定数据库
- -B(--delimited) 去格式化输出,字段名,框都没有,可以使用这个命令直接将结果写入文件
--output_delimited=character 指定分隔符
--print_header 打印列名
- -f query_file(--query_file=query_file) 执行查询文件,以分号分隔,文件有多个SQL只执行第一个
- -o filename(--output_file filename) 结果输出到指定文件,比重定向好,-o是进程自己开启文件流来写,重定向则是需要bash
- -c 查询执行失败时继续执行,比如-f时候文件有多条SQL时。
- -k(--kerberos) 使用kerberos安全加密方式运行impala-shell
- -I 启用LDAP验证
- -u 启用LDAP验证时,指定用户名
内部命令
已经进入impala-shell,可使用参数
- help
- connect <hostname:port> 连接主机,默认端口21000
- refresh <tablename> 增量刷新元数据库
- invalidate metadata 全量刷新元数据库
- explain <sql> 显示查询执行计划与步骤信息
set explain_level 设置显示级别,0到3,默认是2
- shell <shell> 不退出impala-shell执行Linux命令
- profile (查询完成后再执行)查询最近一次查询的底层信息
存储&分区
- 存储方式
- 压缩方式
- 为什么要压缩
减小了数据的体积
减小了IO,相当于增加了解压缩的时间,减小了IO传输文件的时间
- 添加分区
1,partitioned by 创建表时,添加该字段指定分区列表
2,使用alter table 进行分区的添加和删除
create table t_person(id int,name string,age int) partitioned by (type string);
alter table t_person add partition(sex='man');
alter table t_person drop partition(sex='man');
alter table t_person add partition(sex='man',type='boss');
- 分区内添加数据
insert into t_person partition(type='boss') values(1,'similarFish',18),(2,'fish',21);
insert into t_person partition(type='coder') values(3,'fishfish',22),(4,'fishrepo',20);
- 查询指定分区数据
select id,name from t_person where type='coder';
Impala SQL
- 支持数据类型
int,tinyint,smallint,bigint,boolean,char,varchar,string,float,double,real,decimal,timestamp
CDH5.5以上追加支持
array,map,struct,complex
- impala不支持HiveSQL的以下特性
-可扩展机制,例如transform,自定义文件格式,自定义SerDes
-XML,json函数
-某些聚合函数,例如covar_pop,covar_samp,corr,percentile等
-impala仅支持:AVG,count,max,min,sum
-多distinct查询
-UDF,UDAF
-以下语句
analyze table(impala:compute stats)
describe column
describe database
export table
import table
show table extened
show indexes
show columns
由此也可以看出,impala就是hive的一个子集,补充一些hive的功能
- 创建/删除数据库
create database db1;
use db1;
use default;
drop database db1;
- 创建表(内部)
create table tb1(
id int,
name string
);
create table tb2(
id int,
name string
)
row format delimited
fields terminated by '\0' #(impala-1.3.1以上支持\0)
stored as textfile;
create table tb3 like tb1;
alter table tb3 set serdeproperties('serialization'=',' , 'field.delim'=','); #指定文本表字段分隔符
- 创建表(外部)
create external table tb1(
id int,
name string
)
location '/user/data/tb1_data.txt'
create table tb2 like parquet_tab '/user/data/test1.dat'
partition(year int,month tinyint,day tinyint)
localtion '/user/data/tb2_data.txt'
stored as parquet;
- 插入数据
insert into tb1 values(1,'similarFish');
insert (overwrite) into tb3 select * from tb2;
load data local inpath '/usr/data/test.txt' into table tb1;
- 视图
create view v1 as select count(id) as total from tb1; #创建
select * from v1; #查询
describe formatted v1; #查看视图定义
注:不能向impala视图进行插入操作,insert表的数据源可以来自视图
- 数据文件处理
加载数据
insert:插入数据时每条数据差生一个数据文件,会导致小文件非常多,hive要用时会生成很多map,效率十分慢,可以使用第三个方法来消除小文件,不推荐此方法。
load data:在进行批量插入时使用这种方式比较合适。
来自中间表:从一个小文件较多的大表中读取文件并写入新表产生少量的数据文件,也可以用此种方式进行格式转化。
空值处理
impala将"\n"表示为NULL,结合sqoop使用时注意做相应的空字段过滤
也可以使用如下方法:
alter table tb1 set tblproperties("serialization.null.format"="null");
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。