ggangadharan opened a new pull request, #6946:
URL: https://github.com/apache/hive/pull/6946

   ### What changes were proposed in this pull request?
   Vectorize `ntile` when the number of buckets is not a constant: a column, an 
expression, or a
   partition key. Row mode (`GenericUDAFNTile`) reads the number of buckets 
from the first row of each
   partition, and the vectorized path now does the same.
   
   - `VectorPTFEvaluatorNTile`: takes either a constant or a non-constant 
expression. For a
     non-constant one, the value is read from row 0 of the partition's first 
batch when the buffered
     batches are replayed for output. Partition key columns are restored at 
that point, so a
     partition key argument works even though it is not buffered. The bucket 
sizes are set up once per
     partition, so nothing is added per row. A constant is still neither 
evaluated per batch nor
     buffered.
   - `Vectorizer`: non-constant arguments are now vectorized. A non-positive 
constant still falls
     back to row mode, as before. Lead/lag inside the argument now falls back 
with an explicit reason.
     ntile is in `COLUMN_AGNOSTIC_FUNCTIONS`, so that check was skipped for it 
before.
   - `VectorPTFDesc`: corrected the comment on `COLUMN_AGNOSTIC_FUNCTIONS`, 
which said these functions
     don't read input columns. ntile now reads its argument, but only from 
forwarded batches.
   
   Row mode does not validate the number of buckets. The vectorized evaluator 
returns the same result
   wherever row mode returns one, and fails right away wherever row mode fails:
   
   | First-row value `n` (partition of `N` rows) | Row mode | Vectorized |
   |---|---|---|
   | `n > 0` | normal result | same result |
   | `n < -N` | one row per bucket (truncating division) | same result |
   | `0` | `ArithmeticException: / by zero` | `HiveException: NTILE requires a 
positive number of buckets, got: 0` |
   | `NULL` | `NullPointerException` | `HiveException: ... got: NULL` |
   | `-N <= n < 0` | loops until it runs out of memory | `HiveException: ... 
got: n` |
   
   ### Why are the changes needed?
   HIVE-30018 vectorized `ntile` only for a positive int constant. Any other 
argument made the whole
   PTF fall back to row mode, with
   `notVectorizedReason: PTF operator: ntile only supports a positive integer 
constant number of buckets`.
   This is part of the PTF vectorization coverage effort (HIVE-24872).
   
   ### Does this PR introduce _any_ user-facing change?
   No,  Released Hive versions do not vectorize `ntile` at all.
   
   - Queries such as `ntile(col) over (...)` now run vectorized, with the same 
results as row mode.
     Example:
     ```sql
     set hive.vectorized.execution.ptf.enabled=true;
     create table t(name string, rowindex int) stored as orc;
     insert into t values ('a', 3), ('a', 4), ('a', 5), ('a', 6), ('b', 2), 
('b', 9);
     explain vectorization detail
     select name, rowindex, ntile(rowindex) over (partition by name order by 
rowindex) as nt from t;
     ```
     Before: the reducer is not vectorized, with the `notVectorizedReason` 
above.
     After: the reducer runs `VectorPTFOperator` with 
`functionInputExpressions: [col 1:int]`. The
     query returns `a: 1 2 3 3` (3 buckets) and `b: 1 1` (2 buckets) in both 
modes.
   - When the first row holds an invalid number of buckets (0, NULL, or a 
negative count no larger in
     magnitude than the partition), the query still fails, as in row mode. The 
error is now a clear
     `HiveException`, and the negative case fails immediately instead of 
running out of memory.
   
   No configuration changes.
   
   ### How was this patch tested?
   New and updated qtests:
   
   - `clientpositive/vector_ptf_ntile.q`: every non-constant case runs in row 
mode and vectorized mode
     with identical results. A new table holds each partition's number of 
buckets in its first row,
     with NULL, 0 and negative values in the later rows that must never be read.
     - Bucket counts: 1 bucket; fewer buckets than rows (with and without a 
remainder); as many as
       rows; more than rows (the largest int); a negative count larger in 
magnitude than the
       partition; single-row partitions.
     - Argument kinds: column, expression, partition key (not buffered), order 
key. Also checks that
       the first row is taken in ORDER BY order rather than insertion order.
     - Execution paths: multi-row batches at batch size 2 and the default; 
spilling every batch to
       disk; constant and non-constant ntile in one PTF alongside `rank` and 
`sum`.
     - Fallbacks: `explain` shows the row-mode fallback for a non-positive 
constant and for lead/lag in
       the argument.
   - `clientnegative/vector_ptf_ntile_invalid_buckets.q`: 0, NULL and `-N` in 
the first row each fail
     with the vectorized error.
   - Regression run of 21 ntile and vector PTF qtests: `cbo_rp_windowing_2`, 
`lineage_ptf`,
     `ptf_decimal`, `sketches_materialized_view_ntile`, 
`sketches_rewrite_ntile`,
     `sketches_rewrite_ntile_partition_by`, 
`vector_ptf_buffered_complex_scratch_col`,
     `vector_ptf_ntile`, `vector_windowing`, `windowing`, `windowing_ntile`, 
`vector_ptf_1`,
     `vector_ptf_cume_dist`, `vector_ptf_percent_rank`, 
`vector_ptf_unbuffered_partition_col`,
     `vector_ptf_spill_partition_order_overlap`, `vector_ptf_part_simple`,
     `vector_ptf_nested_input_expr`, `vector_ptf_lead_lag`, 
`vector_windowing_rank`,
     `vector_windowing_expressions`.
   
   To reproduce:
   ```bash
   mvn clean install -DskipTests -Pitests
   cd itests/qtest
   mvn test -Dtest=TestMiniLlapLocalCliDriver -Dqfile=vector_ptf_ntile.q
   mvn test -Dtest=TestNegativeLlapLocalCliDriver 
-Dqfile=vector_ptf_ntile_invalid_buckets.q
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to