Hive 多级分区并使用 where 子句进行选择

Posted

技术标签:

【中文标题】Hive 多级分区并使用 where 子句进行选择【英文标题】:Hive multilevel partitions and select with where clause 【发布时间】:2018-10-10 11:14:55 【问题描述】:

我有 2 个分区的 hive 表,第一个分区是城市,第二个分区是村庄,所以每个城市分区都会包含其中所有村庄分区的列表。如下所示

city1/village1
city1/village2
city1/village3
city2/village5
city2/village6

所以如果我的选择语句是select * from table where village = 'village5' 它会在输出结果之前搜索城市 1 和城市 2 中的所有分区吗?或者它会看到 hive 元存储文件并只点击村 5 分区。

【问题讨论】:

【参考方案1】:

这将取决于您的 Hive 版本如何优化。在我当前的版本(1.1.0)中,Hive 能够指向特定分区而不扫描顶部分区

这是一个快速演示。

create table mydb.partition_test 
(id string)
partitioned by (city string, village string);

INSERT OVERWRITE TABLE mydb.partition_test PARTITION (city,village)
select * from (

select '1', 'city1', 'village1'
union all 
select '1', 'city1', 'village2'
union all 
select '1', 'city1', 'village3'
union all 
select '1', 'city2', 'village5'
union all 
select '1', 'city2', 'village6'
) t;

explain select * from mydb.partition_test where village='village5';

STAGE DEPENDENCIES:
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        TableScan
          alias: partition_test
          filterExpr: (village = 'village5') (type: boolean)
          Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: PARTIAL
          Select Operator
            expressions: id (type: string), city (type: string), 'village5' (type: string)
            outputColumnNames: _col0, _col1, _col2
            Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: PARTIAL
            ListSink

从执行计划中可以看出,它能够在没有映射操作的情况下估计该特定分区的记录数,并且表扫描指向特定分区。

【讨论】:

谢谢!!所以hive版本

以上是关于Hive 多级分区并使用 where 子句进行选择的主要内容,如果未能解决你的问题,请参考以下文章

进行查询后,如何通过 Collection 中的 where 子句获取选择的模型

如何使用 HIVE 在 WHERE 语句中对 OR 子句进行分组

HIVE分区,附图说明

如何使用 sqoop 在 hive 中创建多级分区

如果我们在 BigQuery 中使用具有相同分区类型(天)的另一列进行过滤,where 子句中的分区列是不是不是必需的?

Hive / Hue 视图从最新分区(年/月/日)返回所有行