Impala 使用ORC文件格式


Impala 支持使用 ORC 数据文件。默认情况下,在 Impala 3.4.0 中启用 ORC 读取。要禁用,请在启动集群时将 –enable_orc_scanner 设置为 false。

文件类型

格式

压缩编解码器

Impala 可以创造吗?

Impala 可以插入吗?

ORC

结构化的

gzip、Snappy、LZO、LZ4;当前默认为 gzip

是的,在 Impala 2.12.0 及更高版本中。默认情况下,在 Impala 3.4.0 及更高版本中启用 ORC 读取。要禁用,–enable_orc_scanner请false在启动集群时设置为 。

否。通过使用LOAD DATA已经采用正确格式的数据文件导入数据,或者INSERT在 Hive 中使用,然后在 Impala 中使用。 REFRESH table_name

创建 ORC 表并加载数据

如果您没有要使用的现有数据文件,请先以适当的格式创建一个。

创建 ORC 表:

impala-shell解释器中,发出类似于以下内容的命令:

CREATE TABLE orc_table (column_specs) STORED AS ORC;

因为Impala 可以查询它当前无法写入的某些类型的表,所以在创建某些文件格式的表后,您可以使用Hive shell 加载数据。通过Hive或Impala之外的其他机制将数据加载到表中后, 下次连接Impala节点时,在查询表之前发出一条语句,使Impala识别新数据。 REFRESH table_name

例如,您可以通过以下方式在 Impala 中创建一些 ORC 表(通过显式指定列,或克隆另一个表的结构),通过 Hive 加载数据,并通过 Impala 查询它们:

$ impala-shell -i localhost
[localhost:21000] default> CREATE TABLE orc_table (x INT) STORED AS ORC;
[localhost:21000] default> CREATE TABLE orc_clone LIKE some_other_table STORED AS ORC;
[localhost:21000] default> quit;

$ hive
hive> INSERT INTO TABLE orc_table SELECT x FROM some_other_table;
3 Rows loaded to orc_table
Time taken: 4.169 seconds
hive> quit;

$ impala-shell -i localhost
[localhost:21000] default> SELECT * FROM orc_table;
Fetched 0 row(s) in 0.11s
[localhost:21000] default> -- Make Impala recognize the data loaded through Hive;
[localhost:21000] default> REFRESH orc_table;
[localhost:21000] default> SELECT * FROM orc_table;
+---+
| x |
+---+
| 1 |
| 2 |
| 3 |
+---+
Fetched 3 row(s) in 0.11s

为 ORC 表启用压缩

默认情况下,ORC 表采用 zlib(Impala 中的 Deflate)压缩。您可能希望对现有表使用 Snappy 或 LZO 压缩,以在压缩率和解压缩速度之间取得不同的平衡。在 Hive-1.1.0 中,ORC 表支持的压缩是 NONE、ZLIB、SNAPPY 和 LZO。例如,要启用 Snappy 压缩,您需要在通过 Hive shell 加载数据时指定以下附加设置:

hive> SET hive.exec.compress.output=true;
hive> SET orc.compress=SNAPPY;
hive> INSERT OVERWRITE TABLE new_table SELECT * FROM old_table;

如果要转换分区表,则必须完成其他步骤。在这种情况下,请指定类似于以下内容的其他设置:

hive> CREATE TABLE new_table (your_cols) PARTITIONED BY (partition_cols) STORED AS new_format;
hive> SET hive.exec.dynamic.partition.mode=nonstrict;
hive> SET hive.exec.dynamic.partition=true;
hive> INSERT OVERWRITE TABLE new_table PARTITION(comma_separated_partition_cols) SELECT * FROM old_table;

请记住,Hive 不要求您为其指定源格式。考虑转换表中有两个叫做分区列的情况下year,并month以一个活泼的压缩ORC表。结合前面概述的组件以完成此表转换,您将指定类似于以下内容的设置:

hive> CREATE TABLE tbl_orc (int_col INT, string_col STRING) STORED AS ORC;
hive> SET hive.exec.compress.output=true;
hive> SET orc.compress=SNAPPY;
hive> SET hive.exec.dynamic.partition.mode=nonstrict;
hive> SET hive.exec.dynamic.partition=true;
hive> INSERT OVERWRITE TABLE tbl_orc SELECT * FROM tbl;

要对包含分区的表完成类似的过程,您需要指定类似于以下内容的设置:

hive> CREATE TABLE tbl_orc (int_col INT, string_col STRING) PARTITIONED BY (year INT) STORED AS ORC;
hive> SET hive.exec.compress.output=true;
hive> SET orc.compress=SNAPPY;
hive> SET hive.exec.dynamic.partition.mode=nonstrict;
hive> SET hive.exec.dynamic.partition=true;
hive> INSERT OVERWRITE TABLE tbl_orc PARTITION(year) SELECT * FROM tbl;

笔记:

压缩类型在以下命令中指定:

SET orc.compress=SNAPPY;

您可以选择指定替代编解码器,例如NONE, GZIP, LZO此处。

Impala ORC 表的查询性能

通常,期望 ORC 表的查询性能比使用文本数据的表快,但比 Parquet 表慢,因为 Parquet 有很多优化。有关 将 Parquet 文件格式用于高性能分析查询的信息,请参阅对 Impala 表使用 Parquet 文件格式。

在Impala 2.6及更高版本中,Impala 查询针对存储在 Amazon S3 中的文件进行了优化。对于使用文件格式的实木复合地板,ORC,RCFile,SequenceFile,Avro的,和未压缩文本因帕拉表中,设置 fs.s3a.block.size了在核心的site.xml 配置文件决定帕拉如何划分的读取数据文件的I / O工作。此配置设置以字节为单位指定。默认情况下,此值为 33554432 (32 MB),这意味着 Impala 将文件上的 S3 读取操作并行化,就好像它们由 32 MB 块组成一样。例如,如果您的 S3 查询主要访问由 MapReduce 或 Hive 编写的 Parquet 文件,则增加fs.s3a.block.size到 134217728 (128 MB) 以匹配这些文件的行组大小。如果大多数 S3 查询涉及 Impala 编写的 Parquet 文件,请增加到fs.s3a.block.size268435456 (256 MB) 以匹配 Impala 生成的行组大小。

ORC 表的数据类型注意事项

ORC 格式定义了一组数据类型,其名称与对应的 Impala 数据类型的名称不同。如果您使用其他 Hadoop 组件(例如 Pig 或 MapReduce)准备 ORC 文件,则可能需要使用 ORC 定义的类型名称。下图列出了 ORC 定义的类型和 Impala 中的等效类型。

原始类型:

BINARY -> STRING
BOOLEAN -> BOOLEAN
DOUBLE -> DOUBLE
FLOAT -> FLOAT
TINYINT -> TINYINT
SMALLINT -> SMALLINT
INT -> INT
BIGINT -> BIGINT
TIMESTAMP -> TIMESTAMP
DATE (not supported)

复杂类型:

在帕拉2.3和更高,帕拉支持复杂类型 ARRAYSTRUCTMAP。在 Impala 3.2及更高版本中,Impala 还支持 ORC 中的这些复杂类型。

目前仅 Parquet 或 ORC 文件格式支持这些复杂类型。由于 Impala 在 Parquet 上的性能比 ORC 更好,如果您打算使用复杂类型,请先熟悉 Parquet 的性能和存储方面。