为分区数据定义 Impala 表模式

Posted

技术标签:

【中文标题】为分区数据定义 Impala 表模式【英文标题】:Defining an Impala table schema for partitioned data 【发布时间】:2016-05-13 09:19:53 【问题描述】:

以 parquet 格式存储数据帧,并根据文件系统结构中一个或多个列的值在不同文件上进行物理分区,如下所示:

|-region=Europe
|   |-processed=1
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=2
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=3
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=4
|       |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|-region=Asia
|   |-processed=2
|   |   |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|   |-processed=4
|       |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|-region=America
|   |-processed=3
|       |-part-r-00000-0515bd21-1cf1-40f1-885e-055a29284961.gz.parquet
|-_SUCCESS

为了让架构知道分区,我手动添加了每个分区:

ALTER TABLE status_log ADD PARTITION (region='Europe', processed="1") LOCATION '/hdfs/status_logs/region=Europe/processed=1';
ALTER TABLE status_log ADD PARTITION (region='Europe', processed="2") LOCATION '/hdfs/status_logs/region=Europe/processed=2';
ALTER TABLE status_log ADD PARTITION (region='Europe', processed="4") LOCATION '/hdfs/status_logs/region=Europe/processed=2';
...
..
.

有没有办法定义表模式,以便 Impala 读取 树目录结构并自动推断分区模式? 还是总是需要自动将每个分区添加到表中?

【问题讨论】:

【参考方案1】:

您可以使用 hive,因为 impala 共享相同的元存储,这应该不是问题。我假设在 talbe status_logs 的定义中,LOCATION 设置为 '/hdfs/status_logs'。

在配置单元发出命令

msck repair table status_logs

这将自动将所有分区添加到元存储。 然后回到 impala ,你需要做的就是

invalidate metadata status_logs

你可以看到所有的分区。 验证你可以做到(这你可能已经知道了)。

show partitions status_logs

【讨论】:

【参考方案2】:

ALTER TABLE ... RECOVER PARTITIONS,即not yet documented。

【讨论】:

以上是关于为分区数据定义 Impala 表模式的主要内容,如果未能解决你的问题,请参考以下文章

Impala分区表

使用 Impala 选择具有通配符模式的多个表并将它们连接起来

大数据专题--Hive 与 impala

Impala:获取匹配分区列表

Impala 如何支持分区?

通过分区控制 Impala 中的数据局部性