Impala的使⽤
Impala的核⼼开发语⾔是sql语句,Impala有shell命令⾏窗⼝,以及JDBC等⽅式来接收sql语句执⾏,对于复杂类型分析可以使⽤C++或者Java来编写UDF函数。
Impala的sql语法是⾼度集成了Apache Hive的sql语法,Impala⽀持Hive⽀持的数据类型以及部分Hive的内置函数。
需要注意的⼏点:
-
Impala与Hive类似它们的重点都是在与查询,所以像Update,delete等具有更新性质的操作最好不要使⽤这种⼯具,对于删除数据的操作可以通过Drop Table,Alter Table Drop Partition来实现,更新可以尝试使⽤Insert overwrite⽅式。
-
通常使⽤Impala的⽅式是数据⽂件存储在Hdfs⽂件系统,借助于Impala的表定义来查询和管理Hdfs上的数据⽂件。
-
Impala的使⽤⼤多数与Hive相同,⽐如Impala同样⽀持内外部表,以及分区等,可以借鉴参考Hive的使⽤。
Impala-shell命令参数
impala-shell外部命令
所谓的外部命令指的是不需要进⼊到impala-shell交互命令⾏当中即可执⾏的命令参数。impala-shell后⾯执⾏的时候可以带很多参数。你可以在启动 impala-shell 时设置,⽤于修改命令执⾏环境。
impala-shell –h可以帮助我们查看帮助⼿册。也可以参考课程附件资料。
⽐如⼏个常⻅的:
-
impala-shell –r刷新impala元数据,与建⽴连接后执⾏ REFRESH 语句效果相同(元数据发⽣变化的时候)
-
impala-shell –f ⽂件路径 执⾏指的的sql查询⽂件。
-
impala-shell –i指定连接运⾏ impalad 守护进程的主机。默认端⼝是 21000。你可以连接到集群中运⾏ impalad 的任意主机。
-
impala-shell –o保存执⾏结果到⽂件当中去。
展示Impala默认⽀持的内置函数需要进⼊Impala默认系统数据库中执⾏,在其它数据库下⽆法查看!!
1 | show functions; |
impala-shell内部命令
所谓内部命令是指,进⼊impala-shell命令⾏之后可以执⾏的语法.可以输入help;
如上图所示,(type 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 | CREATE TABLE IF NOT EXISTS database_name.table_name ( |
默认建表的数据存储路径跟hive⼀致。也可以在建表的时候通过location指定具体路径。
insert 语句
Impala的INSERT语句有两个⼦句: into和overwrite。into⽤于插⼊新记录数据,overwrite⽤于覆盖已有的记录。
1 | insert into table_name ( |
这⾥,column1,column2,… columnN是要插⼊数据的表中的列的名称。还可以添加值⽽不指定列名,但是,需要确保值的顺序与表中的列的顺序相同。
1 | create table employee ( |
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关键字要求结果数据必须是排序之后的!!