Hello Balazs Hevele, Peter Rozsa, Impala Public Jenkins,

I'd like you to reexamine a change. Please visit

    http://gerrit.cloudera.org:8080/24553

to look at the new patch set (#11).

Change subject: POC: IMPALA-15163 Add geometry bounding box predicate pushdown 
for Parquet
......................................................................

POC: IMPALA-15163 Add geometry bounding box predicate pushdown for Parquet

Implement Parquet row group skipping based on GEOMETRY column
bounding box statistics. Iceberg does not support predicate
pushdown for geometry types yet (see
https://github.com/apache/iceberg/pull/14101), so this operates
at the Parquet level, using the geospatial statistics written to
the column chunks.

Note that pruning during planning would be still possible in Impala -
bounds are available in Iceberg's DataFile metadata returned by
planFiles() - but this is not implemented in this commit.

Writer side: the Parquet table writer tracks the envelope of all
geometries written to each column chunk. The bounding box is then
written to the two metadata systems in the encoding each of them
defines:
- Parquet: ColumnMetaData.geospatial_statistics.bbox, holding
  xmin/xmax/ymin/ymax as doubles (see parquet-format
  Geospatial.md). The generic Statistics min/max are left unset,
  as geometry has no sort order and the spec leaves them undefined
  for it; only null_count is written there.
- Iceberg manifests (via the normal commit path): the lower and
  upper bounds are the two corners of the box, serialized like
  Iceberg's GeospatialBound, i.e. 16 bytes each holding
  xmin||ymin and xmax||ymax as LE doubles.
Empty and malformed geometries have no extent, so they do not
contribute to the box, and do not cause one to be written either.

Reader side: HdfsScanNode.tryComputeGeoBBoxPredicate() recognizes
st_envintersects(CONST, geom_col) conjuncts, computes the constant
geometry's envelope via ESRI, and emits TGeoBBoxPredicate to the
backend. EvaluateGeoBBoxPredicates() in the Parquet scanner checks
bbox overlap against the row group's geospatial statistics (not
Iceberg metadata) and increments NumStatsFilteredRowGroups on miss.

Also fixes Iceberg metadata table queries (e.g. data_files) for
tables with GEOMETRY columns: excludes 'readable_metrics' from the
scan projection because Iceberg 1.11.0's Conversions.fromByteBuffer
does not handle GEOMETRY (throws UnsupportedOperationException).
The column and its nested fields return NULL until a future Iceberg
release adds support.

Testing:
- create table with Impala and verify that bbox is written and used
- check relations that do pushdown (st_envintersects, etc..) and
  st_disjoint that must not do pushdown
- use metadata table queries to verify bbox stats are written to
  Iceberg manifests
- verify that a row group holding only empty/NULL geometries does
  not get a bounding box
- no interop tests yet, would need to find an engine that writes
  statistics

Assisted-by: Claude Opus 5 (Claude Code)
Change-Id: I7265a00caba698a122bc15ecb433c507f36d166f
---
M be/src/exec/parquet/hdfs-parquet-scanner.cc
M be/src/exec/parquet/hdfs-parquet-scanner.h
M be/src/exec/parquet/hdfs-parquet-table-writer.cc
M common/thrift/PlanNodes.thrift
M fe/src/main/java/org/apache/impala/analysis/Analyzer.java
M fe/src/main/java/org/apache/impala/analysis/QueryStmt.java
M fe/src/main/java/org/apache/impala/planner/HdfsScanNode.java
M fe/src/main/java/org/apache/impala/rewrite/PointEnvIntersectsRule.java
M fe/src/main/java/org/apache/impala/util/IcebergMetadataScanner.java
M 
java/hive-geospatial-functions/src/main/java/org/apache/impala/hive/geospatial/esri/GeometryUtils.java
A 
testdata/workloads/functional-query/queries/QueryTest/iceberg-geometry-bbox.test
M testdata/workloads/functional-query/queries/QueryTest/iceberg-geometry.test
M tests/query_test/test_geospatial_functions.py
13 files changed, 704 insertions(+), 32 deletions(-)


  git pull ssh://gerrit.cloudera.org:29418/Impala-ASF refs/changes/53/24553/11
--
To view, visit http://gerrit.cloudera.org:8080/24553
To unsubscribe, visit http://gerrit.cloudera.org:8080/settings

Gerrit-Project: Impala-ASF
Gerrit-Branch: master
Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I7265a00caba698a122bc15ecb433c507f36d166f
Gerrit-Change-Number: 24553
Gerrit-PatchSet: 11
Gerrit-Owner: Csaba Ringhofer <[email protected]>
Gerrit-Reviewer: Balazs Hevele <[email protected]>
Gerrit-Reviewer: Csaba Ringhofer <[email protected]>
Gerrit-Reviewer: Impala Public Jenkins <[email protected]>
Gerrit-Reviewer: Peter Rozsa <[email protected]>

Reply via email to