Created on 04-19-2017 09:35 PM - edited 09-16-2022 04:29 AM
CDH 5.2.0 and 5.10.1
It seems partition pruning is not working when using "or" and conditions with both partitioned and un-partitioned columns.
Creates partitioned table with 3 partitions, 1 file for each partition.
create table part_table (
strcol1 string,
intcol1 int
)
PARTITIONED BY (
keycol STRING
);
insert into part_table partition (keycol='k1') values ('str1', 1);
insert into part_table partition (keycol='k2') values ('str2', 2);
insert into part_table partition (keycol='k3') values ('str3', 3);
Partition pruning worked normally when no un-partitioned columns used
explain select count(*) from part_table where ( (keycol='k1') or (keycol='k2' ) ) +-----------------------------------------------------+ | Explain String | +-----------------------------------------------------+ | Estimated Per-Host Requirements: Memory=0B VCores=0 | | | | PLAN-ROOT SINK | | | | | 01:AGGREGATE [FINALIZE] | | | output: count(*) | | | | | 00:SCAN HDFS [cdragg.part_table] | | partitions=2/3 files=2 size=14B | +-----------------------------------------------------+
When un-partitioned columns used in conditions, no partition pruning performed.
explain select count(*) from part_table where ( (keycol='k0' and intcol1=0) or (keycol='k2' and intcol1=2) ) +-------------------------------------------------------------------------------------+ | Explain String | +-------------------------------------------------------------------------------------+ | Estimated Per-Host Requirements: Memory=0B VCores=0 | | | | PLAN-ROOT SINK | | | | | 01:AGGREGATE [FINALIZE] | | | output: count(*) | | | | | 00:SCAN HDFS [cdragg.part_table] | | partitions=3/3 files=3 size=21B | | predicates: ((keycol = 'k0' AND intcol1 = 0) OR (keycol = 'k2' AND intcol1 = 2)) | +-------------------------------------------------------------------------------------+
I can workaround the situation by another condition on partitioned columns. Is this the proper way to do?
explain select count(*)
from part_table
where (
(keycol='k0' and intcol1=0)
or (keycol='k2' and intcol1=2)
)
and keycol in ('k0', 'k2')
+-------------------------------------------------------------------------------------+
| Explain String |
+-------------------------------------------------------------------------------------+
| Estimated Per-Host Requirements: Memory=0B VCores=0 |
| |
| PLAN-ROOT SINK |
| | |
| 01:AGGREGATE [FINALIZE] |
| | output: count(*) |
| | |
| 00:SCAN HDFS [cdragg.part_table] |
| partitions=1/3 files=1 size=7B |
| predicates: ((keycol = 'k0' AND intcol1 = 0) OR (keycol = 'k2' AND intcol1 = 2)) |
+-------------------------------------------------------------------------------------+
Created 04-19-2017 09:44 PM
You are correct, this is a limitation:
https://issues.cloudera.org/browse/IMPALA-2108
Impala would basically need to do infer the IN predicate that you are using in your workaround.
You are welcome to take a stab at contributing a patch!
Created 04-19-2017 09:44 PM
You are correct, this is a limitation:
https://issues.cloudera.org/browse/IMPALA-2108
Impala would basically need to do infer the IN predicate that you are using in your workaround.
You are welcome to take a stab at contributing a patch!