Hive 多级分区和 select with where 子句
Hive multilevel partitions and select with where clause
我的配置单元 table 有 2 个分区,第一个分区是城市,第二个分区是村庄,所以每个城市分区都将包含 it.Some 中所有村庄分区的列表,比如以下
city1/village1
city1/village2
city1/village3
city2/village5
city2/village6
所以如果我的 select 语句是 select * from table where village = 'village5'
在输出结果之前会搜索城市1和城市2的所有分区吗?或者它会看到 hive metastore 文件并只命中 village5 分区。
这将取决于您的 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
正如您从执行计划中看到的那样,它能够在没有 mapred 操作的情况下估计该特定分区的记录数,并且 table 扫描指向特定分区。
我的配置单元 table 有 2 个分区,第一个分区是城市,第二个分区是村庄,所以每个城市分区都将包含 it.Some 中所有村庄分区的列表,比如以下
city1/village1
city1/village2
city1/village3
city2/village5
city2/village6
所以如果我的 select 语句是 select * from table where village = 'village5'
在输出结果之前会搜索城市1和城市2的所有分区吗?或者它会看到 hive metastore 文件并只命中 village5 分区。
这将取决于您的 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
正如您从执行计划中看到的那样,它能够在没有 mapred 操作的情况下估计该特定分区的记录数,并且 table 扫描指向特定分区。