Eyck Troschke created SPARK-58735:
-------------------------------------

             Summary: "size(array)" forces full read of nested array columns 
and prevents column pruning for Parquet/Delta arrays
                 Key: SPARK-58735
                 URL: https://issues.apache.org/jira/browse/SPARK-58735
             Project: Spark
          Issue Type: Improvement
          Components: Optimizer
    Affects Versions: 4.1.2
         Environment: Apache Spark 4.1.2
Databricks Runtime (Photon)
            Reporter: Eyck Troschke


When applying `size()` to a nested array column stored in Parquet/Delta, Spark 
reads the *entire* array column including all child struct fields, even though 
only array offsets / repetition levels are required to compute the array 
length. This results in significantly higher I/O compared to semantically 
equivalent queries using `explode()` or accessing smaller sub‑arrays.

This behavior occurs in both Apache Spark and Databricks runtimes. It appears 
to be caused by conservative Catalyst planning for nested arrays, which 
prevents column pruning and page skipping.

*Example:*
Table size: ~100GB, ~18B rows  
Column: `events` (ARRAY<STRUCT<...>>)  
Sub‑column: `events.flag_a` (small ARRAY)

```
select sum(size(events));               -- 49s, ~100GB read
select sum(size(events.flag_a));     -- 8s, ~6GB read
select count(*) from t lateral view explode(events);           -- 9s, ~10GB read
select count(*) from t lateral view explode(events.flag_a); -- 8s, ~6GB read
```

Although these queries are semantically equivalent, `size(array)` triggers a 
full scan of all nested array fields, while `explode(array)` allows column 
pruning.

*Expected Behavior:*
`size(array)` should only require reading array offsets / repetition levels and 
should not force full read of all nested struct fields.

*Actual Behavior:*
Spark reads all nested array child columns, causing large and unnecessary I/O.

*Impact:*
Severe performance degradation for large nested arrays in Parquet/Delta tables.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

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

Reply via email to