分区文件路径

数据文件有时在文件系统中使用目录结构进行分区。分区将值从原始数据中移出(在原始数据中,它们必须包含在每一行中),然后移入目录结构,从而节省磁盘空间。分区还可以通过允许跳过整个目录来提高查询性能。

一种常见使用情况是按日期分区:

/data/created=2016-11-01/*
/data/created=2016-11-02/*
/data/created=2016-11-03/*
/data/...

glob 中的文件不包含 created 列,因为此信息是通过文件系统表示的。Vertica 可以将分区值(在本例中为日期)读入表列(在本例中为 created)。

数据可以按多个值分区:

/data/created=2016-11-01/region=northeast/*
/data/created=2016-11-01/region=central/*
/data/created=2016-11-01/region=southeast/*
/data/created=2016-11-01/...
/data/created=2016-11-02/region=northeast/*
/data/created=2016-11-02/region=central/*
/data/created=2016-11-02/region=southeast/*
/data/created=2016-11-02/...
/data/created=2016-11-03/...
/data/...

如果数据按多个值分区,则分区必须以与所有目录路径中相同的顺序显示在 glob 中。在此示例中,创建日期在区域之前,并且必须始终如此。

COPY 语法

要从分区文件中读取值,请使用 COPY PARTITION COLUMNS 选项:

=> CREATE EXTERNAL TABLE records (id int, name varchar(50), created date, region varchar(50))
   AS COPY FROM 'webhdfs:////data/*/*/*'
   PARTITION COLUMNS created, region;

该路径针对每一级目录分区包含一个通配符 (),针对文件再包含一个通配符 ()。通配符的数量必须至少比分区列的数量多 1。数据文件必须至少包含一个实际列;您不能完全通过目录结构来表示数据。

每个分区目录名的第一部分必须与表定义中的列名相匹配。COPY 解析 = 之后的字符串以获取值。空值(例如名为 created= 的目录)被视为 null 值。为了向后兼容,值 __HIVE_DEFAULT_PARTITION__ 也意味着 null。

无法强制转换为正确类型的值将被拒绝,拒绝方式与拒绝数据中的非强制值相同。

查询执行

使用谓词执行查询时,Vertica 会跳过不满足谓词的子目录。此过程称为分区修剪,它可以显着提高查询性能。以下示例仅读取指定区域的所有日期的分区。虽然数据也按日期分区,但查询不限制日期。

=> SELECT * FROM t WHERE region='northeast';

要验证 Vertica 是否正在修剪分区,请在说明计划中查找类似于以下内容的消息:

files with unmatched partition have been pruned

创建分区结构

要创建分区文件结构,可以使用 Hive 或文件导出器。有关使用 Hive 的信息,请参阅 适用于 Vertica 集成的 Hive 入门知识

您可以为任何简单数据类型的列创建分区。但是,作为最佳实践,您应当避免使用 BOOLEAN、FLOAT 和 NUMERIC 类型对列进行分区。