第8章 Impala分区
默认情况下,一张表的所有的数据文件都位于同一个HDFS的目录中。分区是在数据加载期间将数据依据一列或者多列将数据加载到不同的物理位置,以加速对该列或者该几列查询速度的一项技术。
8.1分区技术适用场合
分区技术适用于以下场合:
(1)表的数据量非常庞大,单词读取整个表的时间不在我们承受的范围之内。
(2)表总是依据某些特定的列进行查询。
(3)分区列要有一定的区分度,也就是要包含一定数据的非重复值。
(4)数据已经经过ETL处理。
8.2分区表相关SQL语句
使用分区影响到的Impala SQL的语法如下:
-
CREATE TABLE:我们可以指定一个PARTITONEDBY子句创建一张指定了分区列类型和名称的分区表。
分区列不能被包括在CREATETABLE指定的其他列定义的列表中。 -
ALTER TABLE:我们可以进行添加或者删除分区操作。对于过期的,不再需要的数据,我们可以将其对应的日期型分区删除。
-
INSERT:当我们向分区表中插入数据时,我们需要指定分区列。新插入的数据存储在哪个数据目录的数据文件中,是由分区列的键值决定的。我们也可以使用INSERT OVERWRITE语句将一组数据显式地加载到某个特定的分区来替换整个分区的内容。
##8.3分区修剪
分区修剪技术指的是一个查询可以跳过一个或者多个分区对应的数据文件的一项技术。通过分区修剪技术跳过了大量的没必要扫描的分区,那么这个查询肯定可以使用更少的资源,而且运行效率也更高。
为了有效地确认分区修剪技术是否在一个查询中生效,我们可以通过EXPLAIN输出来检查确认。
explain select name from census where year=2010;
Impala不但能对直接按分区键值作为查询条件的语句进行分区修剪,而且也可以对WHERE条件中的分区列使用传递属性进行分区修剪。这项技术被称为谓词推进
explain select name from census where year=census_year and census_year=2010;
8.4分区键列
一般情况下,选择最频繁使用的,能够对大量数据进行过滤的列作为分区列。我们最经常使用的分区列包括日期时间.
(1)对于基于时间的数据,我们需要将需要使用yyyy-MM-dd。因为Impala 不能基于TIMESTAMP列分区。
(2)分区列的数据类型对真正存储在HDFS上的数据文件的大小影响不大。
(3)我们要时刻谨记Impala查询的是存储在HDFS上的数据。数据文件至少是几十兆或者更大,对HDFS的IO操作才更有优势。对于Parquet表,数据块大小为1GB。
8.5使用不同的文件格式
分区表对文件格式的要求具有很大的灵活性,我们甚至可以为不同的分区使用不同的文件格式。所有的数据可以在同一张表中进行查询。
如何将text类型转换为Parquet类型:
create table census(name string)partitioned by(year smallint);
alter table census add partition(year=2012);--Text format;
alter table census add partition(year=2013);--Text format
alter table census partition(year-2013)set fileformat parquet;
insert into census partition(year=2012)values('Smith'),('Jones'),('Lee'),('singh');
无法直接使用Impala进行创建的数据文件类型,我们可以通过在Hive中执行