Impala的核⼼开发语⾔是sql语句,Impala有shell命令⾏窗⼝,以及JDBC等⽅式来接收sql语句执⾏,对于复杂类型分析可以使⽤C++或者Java来编写UDF函数。

Impala的sql语法是⾼度集成了Apache Hive的sql语法,Impala⽀持Hive⽀持的数据类型以及部分Hive的内置函数。

需要注意的⼏点:

  1. Impala与Hive类似它们的重点都是在与查询,所以像Update,delete等具有更新性质的操作最好不要使⽤这种⼯具,对于删除数据的操作可以通过Drop Table,Alter Table Drop Partition来实现,更新可以尝试使⽤Insert overwrite⽅式。

  2. 通常使⽤Impala的⽅式是数据⽂件存储在Hdfs⽂件系统,借助于Impala的表定义来查询和管理Hdfs上的数据⽂件。

  3. Impala的使⽤⼤多数与Hive相同,⽐如Impala同样⽀持内外部表,以及分区等,可以借鉴参考Hive的使⽤。

Impala-shell命令参数

impala-shell外部命令

所谓的外部命令指的是不需要进⼊到impala-shell交互命令⾏当中即可执⾏的命令参数。impala-shell后⾯执⾏的时候可以带很多参数。你可以在启动 impala-shell 时设置,⽤于修改命令执⾏环境。

impala-shell –h可以帮助我们查看帮助⼿册。也可以参考课程附件资料。

⽐如⼏个常⻅的:

  1. impala-shell –r刷新impala元数据,与建⽴连接后执⾏ REFRESH 语句效果相同(元数据发⽣变化的时候)

  2. impala-shell –f ⽂件路径 执⾏指的的sql查询⽂件。

  3. impala-shell –i指定连接运⾏ impalad 守护进程的主机。默认端⼝是 21000。你可以连接到集群中运⾏ impalad 的任意主机。

  4. impala-shell –o保存执⾏结果到⽂件当中去。

展示Impala默认⽀持的内置函数需要进⼊Impala默认系统数据库中执⾏,在其它数据库下⽆法查看!!

1
show functions;

impala-shell内部命令

所谓内部命令是指,进⼊impala-shell命令⾏之后可以执⾏的语法.可以输入help;


如上图所示,(type help )即是可以输入help ~查询方法定义,无此则查不到方法定义。如下图:


  • connect hostname 连接到指定的机器impalad上去执⾏。如下图:

  • refresh dbname.tablename增量刷新,刷新某⼀张表的元数据,主要⽤于刷新hive当中数据表⾥⾯的数据改变的情况。如下图:

  • invalidate metadata全量刷新,性能消耗较⼤,主要⽤于hive当中新建数据库或者数据库表的时候来进⾏刷新。

  • quit/exit命令 从Impala shell中退出。

  • explain 命令 ⽤于查看sql语句的执⾏计划。如下图:


explain的值可以设置成0,1,2,3等⼏个值,其中3级别是最⾼的,可以打印出最全的信息,如下图:

1
set explain_level=3;

  • profile命令要在执⾏sql语句之后执⾏,可以打印出更加详细的执⾏步骤,主要⽤于查询结果的查看,集群的调优等。如下图:

Impala sql语法

库特定语句

创建数据库

CREATE DATABASE语句⽤于在Impala中创建新数据库。

CREATE DATABASE IF NOT EXISTS database_name;

这⾥,IF NOT EXISTS是⼀个可选的⼦句。如果我们使⽤此⼦句,则只有在没有具有相同名称的现有数据库时,才会创建具有给定名称的数据库。



默认就会在hive的数仓路径下创建新的数据库名⽂件夹,如下文件夹:

1
/user/hive/warehouse/lagoutest.db

删除数据库

Impala的DROP DATABASE语句⽤于从Impala中删除数据库。 在删除数据库之前,建议从中删除所有表。

如果使⽤级联删除,Impala会在删除指定数据库中的表之前删除它。

1
drop database sample cascade;

表特定语句

create table语句

CREATE TABLE语句⽤于在Impala中的所需数据库中创建新表。 需要指定表名字并定义其列和每列的数据类型。

impala⽀持的数据类型和hive类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE IF NOT EXISTS database_name.table_name (
column1 data_type,
column2 data_type,
column3 data_type,
………
columnN data_type
);

CREATE TABLE IF NOT EXISTS my_db.student(
name STRING,
age INT,
contact INT
);

默认建表的数据存储路径跟hive⼀致。也可以在建表的时候通过location指定具体路径。

insert 语句

Impala的INSERT语句有两个⼦句: into和overwrite。into⽤于插⼊新记录数据,overwrite⽤于覆盖已有的记录。

1
2
3
4
5
6
7
insert into table_name (
column1, column2, column3,...columnN
)values (
value1,value2, value3,...valueN
);

Insert into table_name values (value1, value2, value2);

这⾥,column1,column2,… columnN是要插⼊数据的表中的列的名称。还可以添加值⽽不指定列名,但是,需要确保值的顺序与表中的列的顺序相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create table employee (
Id INT,
name STRING,
age INT,
address STRING,
salary BIGINT
);

insert into employee values (1, 'Ramesh', 32, 'Ahmedabad', 20000 );
insert into employee values (2, 'Khilan', 25, 'Delhi', 15000 );
Insert into employee values (3, 'kaushik', 23, 'Kota', 30000 );
Insert into employee values (4, 'Chaitali', 25, 'Mumbai', 35000 );
Insert into employee values (5, 'Hardik', 27, 'Bhopal', 40000 );
Insert into employee values (6, 'Komal', 22, 'MP', 32000 );

overwrite覆盖⼦句覆盖表当中全部记录。 覆盖的记录将从表中永久删除

1
Insert overwrite employee values (1, 'Ram', 26, 'Vishakhapatnam', 37000 );

select语句

Impala SELECT语句⽤于从数据库查询数据, 此查询以表的形式返回数据。


describe 语句

Impala中的describe语句⽤于提供表的描述。 此语句的结果包含有关表的信息,例如列名称及其数据类型。

1
describe table_name;

alter table

Impala中的Alter table语句⽤于对给定表执⾏更改。使⽤此语句,我们可以添加,删除或修改现有表中的列,也可以重命名它们。

参考Hive实现。

delete、truncate table

Impala drop table语句⽤于删除Impala中的现有表。此语句还会删除内部表的底层HDFS⽂件。

1
drop table database_name.table_name;

注意:使⽤此命令时必须⼩⼼,因为删除表后,表中可⽤的所有信息也将永远丢失。

Impala的Truncate Table语句⽤于从现有表中删除所有记录。保留表结构。

您也可以使⽤DROP TABLE命令删除⼀个完整的表,但它会从数据库中删除完整的表结构,如果您希望存储⼀些数据,您将需要重新创建此表。

1
truncate table_name;

Impala对复杂数据类型的⽀持


对于Text存储格式中的复杂类型不⽀持,复杂类型要使⽤parquet格式。

view视图

视图仅仅是存储在数据库中具有关联名称的Impala查询语⾔的语句。 它是以预定义的SQL查询形式的表的组合。

视图可以包含表的所有⾏或选定的⾏。

1
create view if not exists view_name as select statement

创建视图view、查询视图view

1
create view if not exists employee_view AS select name, age from employee;

修改视图

1
alter view database_name.view_name as Select语句

删除视图

1
drop view database_name.view_name;

order by⼦句

Impala ORDER BY⼦句⽤于根据⼀个或多个列以升序或降序对数据进⾏排序。 默认情况下,⼀些数据库按升序对查询结果进⾏排序。

1
select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]

可以使⽤关键字ASC或DESC分别按升序或降序排列表中的数据。

如果我们使⽤NULLS FIRST,表中的所有空值都排列在顶⾏; 如果我们使⽤NULLS LAST,包含空值的⾏将最后排列。

group by⼦句

Impala GROUP BY⼦句与SELECT语句协作使⽤,以将相同的数据排列到组中。

1
select name, sum(salary) from employee group by name;

having⼦句

容易与where过滤进⾏混淆.

如何区分:

1. where:过滤的数据是原始数据,表中本来就存在的数据;

2. having:过滤的是查询结果数据;

按年龄对表进⾏分组,并选择每个组的最⼤⼯资,并显示⼤于20000的⼯资

1
select max(salary) from employee group by age having max(salary) > 20000;

limit、offset

Impala中的limit⼦句⽤于将结果集的⾏数限制为所需的数,即查询的结果集不包含超过指定限制的记录。

⼀般来说,select查询的resultset中的⾏从0开始。使⽤offset⼦句,我们可以决定从哪⾥考虑输出。

1
select * from employee order by salary limit 2 offset 2;

使⽤offset关键字要求结果数据必须是排序之后的!!