Skip to content

Query Controls

Look-it-up reference for the predicate and projection controls. For worked examples and the I/O behavior of each control — predicate pushdown, projection, row limits, splits, and skip — see Predicate Pushdown, Projection, Limits, and Splits.

Supported filter predicates

Category Supported
Comparison operators eq, notEq, lt, ltEq, gt, gtEq
Set operators in (int, long), inStrings
Null operators isNull, isNotNull (any type)
Physical types (comparison) int, long, float, double, boolean, String
Logical types (comparison) LocalDate, Instant, LocalTime, BigDecimal, UUID
Combinators and, or, not (and / or accept varargs for three or more conditions)

All predicates, including those wrapped in not, are pushed down to the statistics level for row-group and page skipping.

The logical-type factories validate the column's logical type at reader creation: BigDecimal predicates require a DECIMAL column and UUID predicates require a UUID column. Applying them to a plain FIXED_LEN_BYTE_ARRAY column without the corresponding logical-type annotation throws IllegalArgumentException. Raw physical-type predicates (int, long, etc.) remain available for columns without logical types or for filtering on the underlying physical value directly. Filters work with all reader types — RowReader, ColumnReader, AvroRowReader, and across multi-file readers.

Column projection forms

Form Description
ColumnProjection.all() Read all columns (default)
ColumnProjection.columns("id", "name") Read specific columns by name
ColumnProjection.columns("address") Select an entire struct and all its children
ColumnProjection.columns("address.city") Select a specific nested field (dot notation)