Impala学习笔记

目录

一、Impala 概述

1.1 什么是 Impala

2.2 Impala 的功能

2.3 Impala 的优缺点

2.4 关系数据库和impala

2.5 Hive,Hbase和Impala

二、Impala 架构

三、Impala的操作命令

3.1 Impala的外部shell

3.2 Impala的外部shell

四、Impala 的 SQL 操作

4.1 Impala数据类型

4.2 数据库操作

4.3 Impala 表操作

4.3.1 创建表

4.3.2 分区表

4.3.3 插入数据

4.3.4 导出数据

4.3.5 select查询

4.3.6 其他操作

4.4 Impala 条款

4.4.1 ORDER BY子句

4.4.2 偏移条款

4.4.3 Union条款

4.4.4 with子句

4.4.5 DISTINCT运算符

总结


一、Impala 概述

1.1 什么是 Impala

        Impala是性能最高的SQL引擎,他提供了访问存储在Hadoop分布式文件系统中的数据最快方法。

        impala与hive相比较如下表

 执行引擎元数据计算时存储
Impalaimpala依赖hive元数据计算时基于内存
Hiveyarn依赖hive元数据基于HDFS

 

2.2 Impala 的功能

  • Impala基于内存,即,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动(数据本地化)。
  • 可以使用Impala使用类SQL查询访问数据。
  • 与其他SQL引擎相比,Impala为HDFS中的数据提供了更快的访问。
  • 使用Impala,可以将数据存储在存储系统中,如HDFS,Apache HBase和Amazon s3。
  • 可以将Impala与业务智能工具(如Tableau,Pentaho,Micro策略和缩放数据)集成。
  • Impala支持各种文件格式,如LZO,序列文件,Avro,RCFile和Parquet。
  • Impala基于Apache Hive的元数据,ODBC驱动程序和SQL语法。
  • Impala可以根据Apache许可证作为开源免费提供。

 

2.3 Impala 的优缺点

(1)优点:

  • 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销。
  • 无需转换为Mapreduce,直接访问存储在HDFS,HBase中的数据进行作业调度,速度快。
  • 使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。
  • 支持各种文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。
  • 可以访问hive的metastore,对hive数据直接做数据分析。

(2)缺点:

  • 对内存的依赖大,且完全依赖于hive。
  • 实践中,分区超过1万,性能严重下降。
  • 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。

 

2.4 关系数据库和impala

Impala使用类似于SQL和HiveQL的Query语言。 下表描述了SQL和Impala查询语言之间的一些关键差异。

Impala

关系型数据库

Impala使用类似于HiveQL的类似SQL的查询语言。

关系数据库使用SQL语言。

在Impala中,您无法更新或删除单个记录。

在关系数据库中,可以更新或删除单个记录。

Impala不支持事务。

关系数据库支持事务。

Impala不支持索引。

关系数据库支持索引。

Impala存储和管理大量数据(PB)。

与Impala相比,关系数据库处理的数据量较少(TB)。

 

2.5 Hive,Hbase和Impala

虽然Impala使用与Hive相同的查询语言,元数据和用户界面,但在某些方面它与Hive和HBase不同。 下表介绍了HBase,Hive和Impala之间的比较分析。

HBase

Hive

Impala

HBase是基于Apache Hadoop的宽列存储数据库。 它使用BigTable的概念。

Hive是一个数据仓库软件。 使用它,我们可以访问和管理基于Hadoop的大型分布式数据集。

Impala是一个管理,分析存储在Hadoop上的数据的工具。

HBase的数据模型是宽列存储。

Hive遵循关系模型。

Impala遵循关系模型。

HBase是使用Java语言开发的。

Hive是使用Java语言开发的。

Impala是使用C ++开发的。

HBase的数据模型是无模式的。

Hive的数据模型是基于模式的。

Impala的数据模型是基于模式的。

HBase提供Java,RESTful和Thrift API。

Hive提供JDBC,ODBC,Thrift API。

Impala提供JDBC和ODBC API。

支持C,C#,C ++,Groovy,Java PHP,Python和Scala等编程语言。

支持C ++,Java,PHP和Python等编程语言。

Impala支持所有支持JDBC / ODBC的语言。

 

二、Impala 架构

        Impala是在Hadoop集群中的许多系统上运行的MPP(大规模并行处理)查询执行引擎。 与传统存储系统不同,impala与其存储引擎解耦。 它有三个主要组件,即Impala Statestore,Impala daemon(Impalad)和Impala元数据或metastore。

Impala Statestore:对应进程statestored。用于跟踪各个impalad实例的位置和状态,让各个impalad实例以集群的方式运行起来。如果挂掉了,impalad实例却仍然会保持集群的方式处理查询请求,但是不能够识别新的impalad实例。

Impala daemon:对应进程impalad,数据计算进程。每个DataNode上有一个。接收客户端的查询并返回结果给客户端。可并发处理请求。

Impala 元数据和元存储:表定义等细节存储在元存储的集中式数据库,本地缓存所有元数据。

查询处理接口:impala-shell,Hue,ODBC/JDBC 驱动程序

Impala查询执处理过程:

  1. 用户程序通过JDBC、ODBC、Impala Shell等Impala 客户端发送Sql语句给Impala;
  2. 用户程序连接到集群中任意Impalad进程,这一进程作为整个查询的协调器;
  3. Impala解析、分析查询,确定哪些任务由集群中哪一Impalad实例执行,并生成最优执行计划;
  4. Impalad实例访问对应HDFS、HBase服务,获取数据;
  5. 每一个Impalad实例将数据返回给协调器Impalad,由其发送结果给客户端。

 

三、Impala的操作命令

3.1 Impala的外部shell

选项

描述

-h, --help

显示帮助信息

-v or --version

显示版本信息

-i hostname, --impalad=hostname

指定连接运行 impalad 守护进程的主机。默认端口是 21000。

-q query, --query=query

从命令行中传递一个shell 命令。执行完这一语句后 shell 会立即退出。

-f query_file, --query_file= query_file

传递一个文件中的 SQL 查询。文件内容必须以分号分隔

-o filename or --output_file filename

 

保存所有查询结果到指定的文件。通常用于保存在命令行使用 -q 选项执行单个查询时的查询结果。

-c

查询执行失败时继续执行

-d default_db or --database=default_db

指定启动后使用的数据库,与建立连接后使用use语句选择数据库作用相同,如果没有指定,那么使用default数据库

-r or --refresh_after_connect

建立连接后刷新 Impala 元数据

-p, --show_profiles

对 shell 中执行的每一个查询,显示其查询执行计划,用于优化sql的。 

-B(--delimited)

去格式化输出,也就是直接显示结果,没有那些条框

--output_delimiter=character

指定分隔符

--print_header

打印列名

1. 连接指定hadoop005的impala主机

[root@hadoop004 datas]# impala-shell -i hadoop005

2. 使用-q查询表中数据,并将数据写入文件中

[root@hadoop005 ~]$ impala-shell -r -q 'select * from student' -o output.txt

3. 查询执行失败时继续执行

[root@hadoop005 ~]$ vim impala.sql

select * from student;
select * from stu;
select * from student;

[root@hadoop005 ~]$ impala-shell -f impala.sql;
[root@hadoop005 ~]$ impala-shell -c -f impala.sql;

4. 在hive中创建表后,使用-r刷新元数据

hive> create table stu(id int, name string);

[hadoop005:21000] > show tables;

Query: show tables
+---------+
| name    |
+---------+
| student |
+---------+

[root@hadoop005 ~]$ impala-shell -r

[hadoop005:21000] > show tables;

Query: show tables
+---------+
| name    |
+---------+
| stu     |
| student |
+---------+

5. 显示查询执行计划 (所谓执行计划,即在查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案)

[root@hadoop005 ~]$ impala-shell -p

[hadoop005:21000] > select * from student;

6.去格式化输出

[root@hadoop005 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

[root@hadoop005 ~]# cat output.txt

1001    tignitgn
1002    yuanyuan
1003    haohao
1004    yunyun

 

3.2 Impala的外部shell

选项

描述

help

显示帮助信息

explain <sql>

显示执行计划

profile

(查询完成后执行) 查询最近一次查询的底层信息

shell <shell>

不退出impala-shell执行shell命令

version

显示版本信息(同于impala-shell -v)

connect

连接impalad主机,默认端口21000(同于impala-shell -r)

refresh <tablename>

增量刷新元数据库

invalidate metadata

全量刷新元数据库(慎用)(同于 impala-shell -r

history

历史命令

1. 查看执行计划

explain select * from student;

2. 查询最近一次查询的底层信息

[hadoop005:21000] > select count(*) from student;

[hadoop005:21000] > profile;

3. 查看hdfs及linux文件系统

[hadoop005:21000] > shell hadoop fs -ls /;

[hadoop005:21000] > shell ls -al ./;

4. 刷新指定表的元数据

hive> load data local inpath '/opt/module/datas/student.txt' into table student;

[hadoop005:21000] > select * from student;

[hadoop005:21000] > refresh student;

[hadoop005:21000] > select * from student;

5. 查看历史命令

[hadoop005:21000] > history;

 

四、Impala 的 SQL 操作

4.1 Impala数据类型

Hive数据类型

Impala数据类型

长度

TINYINT

TINYINT

1byte有符号整数

SMALINT

SMALINT

2byte有符号整数

INT

INT

4byte有符号整数

BIGINT

BIGINT

8byte有符号整数

BOOLEAN

BOOLEAN

布尔类型,true或者false

FLOAT

FLOAT

单精度浮点数

DOUBLE

DOUBLE

双精度浮点数

STRING

STRING

字符系列。可以指定字符集。可以使用单引号或者双引号。

TIMESTAMP

TIMESTAMP

时间类型

BINARY

不支持

字节数组

注意:Impala虽然支持array,map,struct复杂数据类型,但是支持并不完全,一般处理方法,将复杂类型转化为基本类型,通过hive创建表。

 

4.2 数据库操作

--1.创建命令
-- Impala不支持WITH DBPROPERTIE…语法
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];

-- 2.显示数据库
show databases;
show databases like 'hive*';

-- 3. 删除数据库
-- Impala不支持alter database语法  当数据库被 USE 语句选中时,无法删除
drop database hive_db;
drop database hive_db cascade;

-- 4. 切换数据库
use default;

 

4.3 Impala 表操作

4.3.1 创建表

--管理表(内部表)

create table if not exists student2(
id int, name string
)
row format delimited fields terminated by '\t'
stored as textfile
location '/user/hive/warehouse/student2';

--查看表结构
desc formatted student2;




--外部表

create external table stu_external(
id int, 
name string) 
row format delimited fields terminated by '\t' ;

-- 查看表结构
desc formatted stu_external;

4.3.2 分区表

--创建分区表
create table stu_par(id int, name string)
partitioned by (month string)
row format delimited 
fields terminated by '\t';

--向表中导入数据
alter table stu_par add partition (month='201810');
load data inpath '/user/hive/warehouse/student.txt' into table stu_par partition(month='201810');
insert into table stu_par partition (month = '201811') select * from student;

--注意:如果分区没有,load data导入数据时,不能自动创建分区。
--Load data时,只能从hdfs上load数据,不能从Linux本地load,即不能使用local语法

--查询分区表中的数据
select * from stu_par where month = '201810';

--增加多个分区
alter table stu_par add partition (month='201812') partition (month='201813');

--删除分区
alter table stu_par drop partition (month='201812');

--查看分区
show partitions stu_par;

4.3.3 插入数据

--创建一张表
create table doctor(id int, name string,age int) row format delimited fields terminated by '\t';

--通过insert插入数据
insert into table  doctor values(1,'tom',18);
insert into table  doctor (name,age) values('cat',19);


--进行覆盖插入,前边需要加overwrite
insert overwrite table  doctor  values(1,'hello',20);

--根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists doctor2 as select id, name from doctor;


--创建表时通过location指定加载数据路径
create table if not exists doctor3(
id int, name string,age int
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/doctor3';

4.3.4 导出数据

impala不支持insert overwrite…语法导出数据
impala 数据导出一般使用 impala -o

[root@hadoop004 ~]# impala-shell -q 'select * from doctor' -B --output_delimiter="\t" -o output.txt
[root@hadoop004 ~]# cat output.txt 
1	hello	20 

Impala 不支持export和import命令

4.3.5 select查询

  1. 基本的语法跟hive的查询语句大体一样
  2. Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY
  3. Impala中不支持分桶表
  4. Impala不支持COLLECT_SET(col)和explode(col)函数

4.3.6 其他操作

--描述表
describe doctor;


-- alter table

--表重新名,例如将doctor重命名为newdoctor
alter table doctor rename to newdoctor;

--向表中添加列,例如向newdoctor表中添加tel列和addr列。
alter table newdoctor add columns (tel string,addr string);

--删除列,例如把newdoctor表中的age列删除,删除后会发现数据错位。
alter table newdoctor drop age;

--更改列的名称和类型,例如将tel改为telephone int类型。
alter table newdoctor change tel telepnhone int;


--drop table
--Impala drop table语句用于删除Impala中的现有表。 如果删除的是内部表,则会将表对应的hdfs目录删除,如果是外部表,则会保留hdfs目录。
drop table default.student;


--truncate table
--Impala的Truncate Table语句用于从现有表中删除所有记录,但是会保留表结构。
truncate newdoctor;


--show tables
show tables;


--创建视图
create view emp_view as select empno,ename,job from emp;
--查询视图
select * from emp_view;
--删除视图
drop view emp_view;

 

4.4 Impala 条款

4.4.1 ORDER BY子句

        Impala ORDER BY子句用于根据一个或多个列以升序或降序对数据进行排序。 默认情况下,一些数据库按升序对查询结果进行排序。以下是ORDER BY子句的语法。

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

        可以使用关键字ASC或DESC分别按升序或降序排列表中的数据。以同样的方式,如果我们使用NULLS FIRST,表中的所有空值都排列在顶行; 如果我们使用NULLS LAST,包含空值的行将最后排列。

--将员工表按照奖金升序排序,如果有空值,将空值放在顶行。
select * from emp order by comm nulls first;

--将员工表按照奖金升序排序,如果有空值,将空值放在尾行。
select * from emp order by comm nulls last;

4.4.2 偏移条款

        一般来说,select查询的结果中的行从0开始。使用offset子句,我们可以决定从哪里考虑输出。 例如,如果我们选择偏移为0,结果将像往常一样,如果我们选择偏移为2,结果从第2行开始。

select * from emp order by empno limit 4;

select * from emp order by empno limit 4 offset 0;

select * from emp order by empno limit 4 offset 2;

4.4.3 Union条款

可以使用Impala的Union子句组合两个查询的结果,分为Union和Union all。

        Union:对两个结果集进行并集操作,会进行去重,不包括重复行;

        Union All:对两个结果集进行并集操作,不会进行去重,包括重复行;

select * from emp limit 3 union select * from emp  limit 3;

select * from emp limit 3 union all select * from emp  limit 3;

4.4.4 with子句

如果查询太复杂,我们可以为复杂部分定义别名,并使用Impala的with子句将它们包含在查询中。语法如下

with x as (select 1), y as (select 2) (select * from x union y);
-- 查询job = 'CLERK 和 sal > 2000 的所有人
with t1 as (select * from emp where job = 'CLERK'),
t2 as (select * from emp where sal > 2000) 
(select * from t1 union select * from t2);

4.4.5 DISTINCT运算符

Impala中的distinct运算符用于通过删除重复值来获取唯一值。

select distinct columns… from table_name;
--将员工表根据job进行去重。
select distinct job from emp;

 


总结

文章中没有提到的SQL操作与hive中基本一致

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值