第三章 Impala 概念及架构
3.1 Impala服务组件
3.1.1 Impala Deamon
该进程运行于集群每个节点的守护进程,是Impala的核心组件,每个节点该进程的名称为 impalad 。
> ps -ef|grep impalad
负责读取数据文件;接受来自impala-shell、Hue / JDBC/ODBC的查询请求,与其他节点并行分布式工作,
并将本节点的查询结果返回给中心协调者节点(建议使用JDBC/ODBC接口以round-robin的方式将每个查询提交的不同节点 impalad上)。
3.1.2 Impala Statestore
Statestore 搜集集群中 impalad 进程节点的健康状况,并不断的将健康状况结果转发给所有的 impalad 进程节点.
> ps -ef|grep statestored
一个 impala 集群只需要一个 statestore 进程节点。 Statestore的目的:在集群故障时对 impalad进程节点同步信息,
3.1.3 Impala Catalog
当 Impalad 集群中执行SQL 语句会引起元数据变化时,catalog服务负责将这些变化推送到其他 impalad进程节点上。
3.3.1 搜集信息
hive> analyze table;
impala> compute stats;
第四章 SQL语句
4.1 注释
4.2 数据类型
BIGINT、BOOLEAN、FLOAT、INT、REAL(DOUBLE)、
SMALLINT、2字节的整型; TINTYNT、1字节的整型、
STRING、不能直接将STRING转成BOOLEAN,但是可以使用CASE表达式针对不同的STRING数据返回TRUE/FALSE
> select cast("123" as int);//返回123
> select cast(true as int);//返回1
> select cast(false as int);//返回0
TIMESTAMP、> select cast('1966-07-30' as timestamp);、、返回1966-07-30 00:00:00、 Now()
4.4 SQL操作符
4.4.1 表达式 where * BETWEEN 上限值 AND 下限值;
IN、> select * from test where a in("a","abc");//传入的值(a) 只要与期中的任意一个值匹配,就会返回RURE。//返回a abc
IS NULL、> select * from test where a is not null;//判断给定的值是否为空
LIKE、> select * from test where a like 'ab_'; //比较string数据,_匹配单个字符,%匹配多个字符。
REGEXP/reglike、> select * from test where a regexp 'a.*'; //用来检查一个值是否与一个正则表达式相匹配.、、返回a ab abc
4.5 AS 别名 ; 原始的名后紧跟别名也可以; 可为表、列、join结果集等指定更直观的别名
4.5.2 标识符,大小写不敏感
4.5.3 启动 $ impala-shell
数据库、内部表、外部表(external)、视图(>creat view v1 as select c1,c2 from t1 group by c1,c2 order by c1 limit 5;)
4.5.5
视图是可以作为别名查询的轻量级的逻辑结构。我们可以在查询中使用表明的位置指定一个视图名称。可以实现更细粒度的访问控制。只能查询到允许他看到的列。
> creat table slow (x int,s string) stored as textfile;
> creat view report as select s from slow where x between 20 and 30;
> insert into slow values(21,'ajhk'),(30,'kjhk');
> select * from report; //查询的是视图名 指向对应表
> creat table fast (s string) partitioned by (x int) stored as parquet;
> insert into fast partitione(x=22) values('ddfd');
> insert into fast partitione(x=28) values('hgdd');
> alter view report as select s from fast where x between 20 and 30;
> select * from report;
4.5.6 显示视图
> desc report;
> desc formatted report;
> select * from v1 order by c1 desc limit 10;
注:不能向视图进行插入操作。如果针对视图的 where条件列中包含了分区键,Impala 不会进行分区修剪。
4.6 SQL语句子集
> alter table old_name rename to new_name;
//通过在表名前指定数据库,可以把一张表从一个数据库 移动 到另一个数据库。
>
> creat database d1;
> creat database d2;
> creat database d3;
>
> use d1;
> creat table mobile(x int);
>
> use d2;
> alter table d1.mobile rename to mobile;
>
> use d1 ;
> alter table d2.mobile rename to d3.mobile;
>
> use d3;
> show tables; //出现了mobile表
> alter table ** set location 'hdfs_path_directory'; //改变 Impala的表对应的数据文件的物理位置
> alter table ** set fileformat {...}; //改变底层数据文件格式
> alter table ** set serdeproperties ('serialization.format' = ',' , 'field.delim' = ','); //改变已存在的表/分区的分隔符
$ hdfs dfs -ls /user/hive/warehouse/表名
$ hdfs dfs -cat /user/hive/warehouse/表名 USING (id, type)
where t1.c1 > 100;
//USING (id, type)用于各表关联列具有相同名称的情况。
2.SQL-89 风格JOIN: 用逗号分隔用到的表,用 where 条件关联列进行等值比较。
易使用,也很容易由于删除某些 where子句导致连接无法工作。
> select t1.c1, t2.c2 from t1, t2
WHERE t1.id = t2.id and t1.type = t2.type
AND t1.c1 > 100;
3.自连接
对某张表 不同列 进行关联查询 以展示数据之间的父子关系或树形结构。
无需显式指定自连接关键字,只要对 一张表 指定不同的 别名,看作两张表即可。
> select t1.id, t2.parent, t1.c1, t2.c2 from a t1,a t2
where t1.id = t2.parent; // 不能理解
4.笛卡尔连接
不能用于 ON子句,和:
> select ... from t1 JOIN t2;
> select ... from t1, t2;
只用于 CROSS JOIN,或可以用 where子句进行过滤:
> select ... from t1 CROSS JOIN t2;
> select ... from t1 CROSS JOIN t2 WHERE ...;
5.内连接
是最常用的类型,结果集包含所有参与连接的表中匹配的列,这些列具有满足在不同表之间关联列的等值匹配。
如果参与连接的表具有相同的列名,则需要使用完全限定名 或者列别名进行引用。支持SQL-89/92。
> select t1.id, c1,c2 from t1,t2 WHERE t1.id = t2.id;
> select t1.id, c1,c2 from t1 JOIN t2 ON t1.id = t2.id;
> select t1.id, c1,c2 from t1 INNER JOIN t2 ON t1.id = t2.id;
6.外连接 ..OUTER join
从左手型表(LEFT),右手型表(RIGHT),全外连接表(FULL) 获取所有的 行数据。
如果外连接的表中没有与其他表关联匹配的数据,结果集中相关列会被置为 NULL。
用的是 SQL-92语法,(join不能用逗号代替),不支持 SQL-89的连接语法。
> select * from t1 LEFT OUTER JOIN t2 on t1.id = t2.id;
> select * from t1 RIGHT OUTER JOIN t2 on t1.id = t2.id;
> select * from t1 FULL OUTER JOIN t2 on t1.id = t2.id;
7.等值连接和非等值连接
Impala默认进行等值连接查询。inner outer full semi 都是。
可以使用比较运算符实现 非等值连接,可以避免产生超出资源限制的超大结果集。
如果执行的 非等值链接产生的结果集大小可以接受,可使用 cross join ,并且在 where子句中进行额外的比较操作。
> select .. from t1 CROSS JOIN t2 WHERE t1.total > t2.maximum_price;
8.Impala不支持自然连接和反连接
9.在如下情况使用连接查询:
。当需要从不同物理上独立存储的表进行关联获取数据时。
。将数据归一化,连接查询允许我们减少数据复制,将不同的数据存储在不同的表中。
。对于那些很少使用的某些列,我们可以将其移动到其他表中以减少大部分查询的负载。
。减少歧义on where中
> select t1.c1 as first_id, t2.c2 as second_id from t1 join t2 on first_id = second_id;
> select fact.custno, dimension.custno from customer_data as fact join customer_address as dimension using (custno);
10.order by 排序
这是一个代价非常高的操作,因为在排序之前,整个结果集需要传输到一个节点上进行排序,需要更多的内存容量。
order by .. [ASC | DESC] [NULLS FIRST | NULLS LAST] 指定升序/降序,null值位于结果集开头还是结尾。
Impala-shell中对一个会话所有的查询设置默认limit:
> set DEFAULT_ORDER_BY_LIMIT=...
也可以在启动Inpala进程时指定:
-default_query_options default_order_by_limit=...在实例级别进行限制。
11.group by
需要使用像 count()、sun()、avg()、min()、max()这样的聚集函数。
> select **,sum(s1) as s from *** group by ***
order by sum(s1) desc limit 5;
12.having
对带有group by 子句的select查询执行过滤操作,它过滤的是 聚集函数运算的结果,而不是原始数据的行。
> select ss_item as item,
count(ss_item) as time_p,
sum(ss_11) as **,
from **
group by ss_item //用的是原始数据
having item >= 100 //用的是别名
order by sum(ss_11) //用的是原始数据
limit 5;
13.offset
查询自逻辑第一行之后的某行开始返回结果。经常结合order by 、limit一起使用。
> select x from numbers order by x limit 5 offset 5; //从5开始对缓存的结果集进行分页显示在页面上
14.union
合并多个查询结果集。就好像是使用了 distinct一样。
> select**1 union [distinct | all] select**2 //去重. 不使用all的union耗更多内存和时间。
15.with
放在 select之前,用于为 复杂表达式定义一个别名。
方便维护、可读性强、提高兼容性。
> with t1 as (select 1), t2 as (select 2)
select * from t1 union all select * from t2;
16.hints
可以更好的从底层调整SQL查询的工作方式。
对于那些丢失了统计信息或者其他因素导致查询成本异常昂贵时,作为临时解决方案。
使用【】将特定的hints括起来使用。
explain可以确认一个特定查询使用了什么关联策略。
[shuffle]:join使用分区技术,该方式对于处理 大表与大表之间的关联非常有效。
[broadcast]:join使用广播技术,将右手型表的所有内容发送到与之关联的所有节点上。对于处理 大表与小表 之间的关联非常有效。
> select ... from d1 join [broadcast]d2 on ..=..;
17.distinct 去重
过滤并删除结果集中的重复值。
> select distinct c1,c2 from xx; //过滤两列组合的重复值
> select count(distinct c1,c2) from xx; //计算两个列 非重复值的个数
18.show..; use..;
> show databases like 'd*';
> show tables in default 't*';
> show functions in **; //显示的是UDFs, 查看内嵌函数的定义
> show aggregate functions in **; //UDAFs
> show table/column stats db.tb; //对于调整和诊断性能,大表和复杂连接查询非常重要
启动impala-shell时连接到特定数据库:
impala-shell -d db_name //-d 选项对于运行SQL脚本非常有用,使用之后无需把USE语句硬编码在SQL脚本中。
4.7 内嵌函数
聚集函数不会返回Null值,会忽略掉列中null值。
cast(10 as string) 类型转换
concat('123', cast(45 as string), '6') 字符串连接
case a when b then c [when d then e].. end 将表达式与多个可能进行比较,如果匹配到则返回相应结果。
pid()返回会话连接到的impala进程ID。
user()返回连接到impala进程的Linux用户名。
current_database()返回当前数据库名称。
version()...
...
4.8 聚集函数