Skip to content

Conversation

@coderfender
Copy link
Contributor

@coderfender coderfender commented Oct 17, 2025

Which issue does this PR close?

Closes #531 .
(Partially closes 531) . The ANSI changes to support AVG will be tracked in a new PR

Rationale for this change

DataFusion's default SUM doesn't match Spark's overflow semantics. This implementation ensures we get the exact same behavior as Spark for integer overflow in all 3 eval modes (ANSI , Legacy and Try mode)

What changes are included in this PR?

This PR adds native Rust implementation for SUM aggregation on integer types (byte, short, int, long)

Native changes (Rust):
(Inspired from SumDecimal and spark's SUM impl)

  1. New SumInteger aggregate function that handles SUM for all integer types (in coherence with Spark)
  2. Support all eval modes (ANSI , Legacy and Try)
    ( Implemented code in similar fashion of spark leveraging Option<i64> to represent NULL and numeric values for sum , and an additional parameter called has_all_nulls which is leveraged in Try mode to distinguish if NULL sum is caused by all NULL inputs or the fact that the sum overflowed. (Spark does this with shouldTrackIsEmpty and assigning NULL to running sum which is a long datatype) )
  3. Implemented groups accumulator (which should optimize group by op)

Scala side changes :

  1. Update CometSum to add ANSI support (ANSI and Try)
  2. Change proto schema to pass along eval_mode instead of fail_on_error to support Legacy, ANSI and Try eval modes
  3. Added tests for NULL (had to force cast nulls as java.lang.Long to avoid Scala's auto-boxing feature which auto casts objects to primitive types there by casting nulls to 0s) handling in both simple and GROUP BY agg .
  4. Added tests for both ANSI and non-ANSI mode tests for the input types Int, Short, Byte
  5. Added try_sum overflow tests with GROUP BY (mixed overflow/non-overflow groups)

How are these changes tested?

  1. Unit tests on Scala side to test various aggregation use cases in all 3 eval modes .
  2. Added new tests for groupBy use cases to test out groups accumulator

@coderfender coderfender marked this pull request as draft October 17, 2025 19:13
@coderfender
Copy link
Contributor Author

Draft PR to support sum function - WIP

@coderfender coderfender marked this pull request as ready for review October 28, 2025 07:53
@coderfender coderfender changed the title [WIP]: Support ANSI mode sum expr feat: Support ANSI mode sum expr Oct 29, 2025
@codecov-commenter
Copy link

codecov-commenter commented Oct 30, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 59.41%. Comparing base (f09f8af) to head (126c053).
⚠️ Report is 768 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##               main    #2600      +/-   ##
============================================
+ Coverage     56.12%   59.41%   +3.28%     
- Complexity      976     1377     +401     
============================================
  Files           119      167      +48     
  Lines         11743    15330    +3587     
  Branches       2251     2546     +295     
============================================
+ Hits           6591     9108    +2517     
- Misses         4012     4938     +926     
- Partials       1140     1284     +144     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@coderfender coderfender force-pushed the support_overflow_sum_function branch from 970d693 to c0715aa Compare November 7, 2025 01:16
@coderfender
Copy link
Contributor Author

@andygrove , @comphead I believe this should be ready for review (pending CI)

@comphead
Copy link
Contributor

comphead commented Nov 7, 2025

- Windows support *** FAILED *** (3 seconds, 973 milliseconds)
  Expected only Comet native operators, but found Project.
  plan: Project
  +- Window
     +- CometExchange
        +- CometScan [native_iceberg_compat] parquet

Thats actually interesting why would window fall back, we planning to fallback on windows in #2726 but the test would still preserve windows, so I think we need to check a fallback reason

@coderfender coderfender force-pushed the support_overflow_sum_function branch from 6dcf47b to 13b7d68 Compare November 11, 2025 22:02
@coderfender
Copy link
Contributor Author

- Windows support *** FAILED *** (3 seconds, 973 milliseconds)
  Expected only Comet native operators, but found Project.
  plan: Project
  +- Window
     +- CometExchange
        +- CometScan [native_iceberg_compat] parquet

Thats actually interesting why would window fall back, we planning to fallback on windows in #2726 but the test would still preserve windows, so I think we need to check a fallback reason

This is no longer a failing test after I rebased with main branch

@coderfender
Copy link
Contributor Author

@andygrove @comphead . All the tests passed and the PR is rest for review

Copy link
Member

@andygrove andygrove left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coderfender This LGTM. I am going to pull the PR locally and do some testing/benchmarking today. Could you rebease/upmerge?

@andygrove
Copy link
Member

Here are microbenchmark results:

Legacy mode

OpenJDK 64-Bit Server VM 17.0.16+8-Ubuntu-0ubuntu122.04.1 on Linux 6.8.0-87-generic
AMD Ryzen 9 7950X3D 16-Core Processor
TPCDS Micro Benchmarks:                   Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------
agg_sum_integers_no_grouping                       1720           1812         129        167.4           6.0       1.0X
agg_sum_integers_no_grouping: Comet                1171           1179          11        246.0           4.1       1.5X

Running benchmark: TPCDS Micro Benchmarks
  Running case: agg_sum_integers_with_grouping
  Stopped after 2 iterations, 5105 ms
  Running case: agg_sum_integers_with_grouping: Comet
  Stopped after 2 iterations, 2803 ms

OpenJDK 64-Bit Server VM 17.0.16+8-Ubuntu-0ubuntu122.04.1 on Linux 6.8.0-87-generic
AMD Ryzen 9 7950X3D 16-Core Processor
TPCDS Micro Benchmarks:                   Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------
agg_sum_integers_with_grouping                     2529           2553          34        113.9           8.8       1.0X
agg_sum_integers_with_grouping: Comet              1396           1402           8        206.3           4.8       1.8X

ANSI mode

OpenJDK 64-Bit Server VM 17.0.16+8-Ubuntu-0ubuntu122.04.1 on Linux 6.8.0-87-generic
AMD Ryzen 9 7950X3D 16-Core Processor
TPCDS Micro Benchmarks:                   Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------
agg_sum_integers_no_grouping                       1751           1802          72        164.5           6.1       1.0X
agg_sum_integers_no_grouping: Comet                1358           1360           3        212.1           4.7       1.3X

Running benchmark: TPCDS Micro Benchmarks
  Running case: agg_sum_integers_with_grouping
  Stopped after 2 iterations, 5563 ms
  Running case: agg_sum_integers_with_grouping: Comet
  Stopped after 2 iterations, 3668 ms

OpenJDK 64-Bit Server VM 17.0.16+8-Ubuntu-0ubuntu122.04.1 on Linux 6.8.0-87-generic
AMD Ryzen 9 7950X3D 16-Core Processor
TPCDS Micro Benchmarks:                   Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------
agg_sum_integers_with_grouping                     2772           2782          14        103.9           9.6       1.0X
agg_sum_integers_with_grouping: Comet              1834           1834           1        157.1           6.4       1.5X

@coderfender
Copy link
Contributor Author

coderfender commented Nov 21, 2025

@andygrove , Please take a look whenever you get a chance . I made changes per review and fixed merge conflicts

@coderfender coderfender changed the title feat: Support ANSI mode sum expr feat: Support ANSI mode sum expr (int inputs) Nov 28, 2025
@coderfender coderfender requested a review from andygrove December 1, 2025 21:35
@coderfender
Copy link
Contributor Author

@andygrove I rebased with main and fixed merge conflicts . Please review whenever you get a chance

@coderfender
Copy link
Contributor Author

Resolved scalafix error

@coderfender
Copy link
Contributor Author

@andygrove , @martin-g could you please take a (hopefully final) look at the PR and let me know if you think we need further changes ?

@andygrove
Copy link
Member

@andygrove , @martin-g could you please take a (hopefully final) look at the PR and let me know if you think we need further changes ?

The changes in the PR are pretty substantial (~800 new lines of code) so there is a lot to review. I don't see anything that concerns me at this point, but I would like to run some benchmarks to check that there are no regressions in the non ANSI case. Unfortunately, we don't have any existing microbenchmarks that work with ANSI enabled, so we need to create something.

@coderfender
Copy link
Contributor Author

Thank you @andygrove let me go ahead and work on generating benchmarks for ANSI supported aggregate expressions

@coderfender
Copy link
Contributor Author

Created #2883 to support benchmarking with ANSI mode

@coderfender
Copy link
Contributor Author

Ran benchmarking with ANSI mode enabled for SUM aggregated function only and here are the results

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM, ansi mode enabled : true
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : true
  Stopped after 32 iterations, 2013 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : true
  Stopped after 38 iterations, 2032 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM, ansi mode enabled : true:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : true                                                                   48             63          17        219.2           4.6       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : true                                                                   36             53          17        289.7           3.5       1.3X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM, ansi mode enabled : true
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : true
  Stopped after 30 iterations, 2071 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : true
  Stopped after 36 iterations, 2011 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM, ansi mode enabled : true:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : true                                                                    47             69          13        221.2           4.5       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : true                                                                    35             56          33        303.5           3.3       1.4X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM, ansi mode enabled : true
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : true
  Stopped after 33 iterations, 2049 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : true
  Stopped after 33 iterations, 2035 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM, ansi mode enabled : true:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : true                                                                       50             62          17        211.4           4.7       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : true                                                                       37             62          33        281.9           3.5       1.3X

Running benchmark: Grouped HashAgg Exec: multiple group keys (cardinality 100), single aggregate SUM
  Running case: SQL Parquet - Spark (SUM) isANSIMode: true
  Stopped after 32 iterations, 2026 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: true
  Stopped after 34 iterations, 2010 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: multiple group keys (cardinality 100), single aggregate SUM:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: true                                                    49             63          23        213.9           4.7       1.0X
SQL Parquet - Comet (SUM) isANSIMode: true                                                    36             59          23        287.7           3.5       1.3X

Running benchmark: Grouped HashAgg Exec: multiple group keys (cardinality 1024), single aggregate SUM
  Running case: SQL Parquet - Spark (SUM) isANSIMode: true
  Stopped after 29 iterations, 2131 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: true
  Stopped after 43 iterations, 2014 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: multiple group keys (cardinality 1024), single aggregate SUM:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: true                                                     48             73          32        217.1           4.6       1.0X
SQL Parquet - Comet (SUM) isANSIMode: true                                                     36             47          18        290.1           3.4       1.3X

Running benchmark: Grouped HashAgg Exec: multiple group keys (cardinality 1048576), single aggregate SUM
  Running case: SQL Parquet - Spark (SUM) isANSIMode: true
  Stopped after 2 iterations, 2952 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: true
  Stopped after 5 iterations, 2276 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: multiple group keys (cardinality 1048576), single aggregate SUM:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: true                                                      1463           1476          18          7.2         139.5       1.0X
SQL Parquet - Comet (SUM) isANSIMode: true                                                       396            455          92         26.5          37.8       3.7X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 100), multiple aggregates SUM isANSIMode: true
  Running case: SQL Parquet - Spark (SUM) isANSIMode: true
  Stopped after 13 iterations, 2075 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: true
  Stopped after 35 iterations, 2051 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 100), multiple aggregates SUM isANSIMode: true:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: true                                                                     56            160          78        188.0           5.3       1.0X
SQL Parquet - Comet (SUM) isANSIMode: true                                                                     34             59          45        309.5           3.2       1.6X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1024), multiple aggregates SUM isANSIMode: true
  Running case: SQL Parquet - Spark (SUM) isANSIMode: true
  Stopped after 16 iterations, 2103 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: true
  Stopped after 37 iterations, 2016 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1024), multiple aggregates SUM isANSIMode: true:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: true                                                                      55            131          97        189.6           5.3       1.0X
SQL Parquet - Comet (SUM) isANSIMode: true                                                                      38             54          30        273.0           3.7       1.4X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1048576), multiple aggregates SUM isANSIMode: true
  Running case: SQL Parquet - Spark (SUM) isANSIMode: true
  Stopped after 20 iterations, 2118 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: true
  Stopped after 22 iterations, 2025 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1048576), multiple aggregates SUM isANSIMode: true:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: true                                                                         55            106          71        189.8           5.3       1.0X
SQL Parquet - Comet (SUM) isANSIMode: true                                                                         35             92          73        301.9           3.3       1.6X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM on decimal
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : true
  Stopped after 2 iterations, 2658 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : true
  Stopped after 9 iterations, 2233 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM on decimal:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : true                                                  1257           1329         102          8.3         119.9       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : true                                                   237            248          15         44.2          22.6       5.3X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM on decimal
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : true
  Stopped after 2 iterations, 2615 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : true
  Stopped after 8 iterations, 2222 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM on decimal:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : true                                                   1307           1308           0          8.0         124.7       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : true                                                    257            278          29         40.7          24.6       5.1X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM on decimal
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : true
  Stopped after 2 iterations, 8222 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : true
  Stopped after 2 iterations, 2853 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM on decimal:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : true                                                      4082           4111          42          2.6         389.3       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : true                                                      1412           1427          20          7.4         134.7       2.9X




Running benchmark: Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM, ansi mode enabled : false

  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : false
  Stopped after 9 iterations, 2064 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : false
  Stopped after 12 iterations, 2025 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM, ansi mode enabled : false:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : false                                                                  221            229          12         47.5          21.0       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : false                                                                  153            169          25         68.5          14.6       1.4X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM, ansi mode enabled : false
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : false
  Stopped after 9 iterations, 2207 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : false
  Stopped after 12 iterations, 2053 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM, ansi mode enabled : false:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : false                                                                   226            245          30         46.4          21.6       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : false                                                                   165            171           4         63.4          15.8       1.4X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM, ansi mode enabled : false
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : false
  Stopped after 2 iterations, 4153 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : false
  Stopped after 3 iterations, 2645 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM, ansi mode enabled : false:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : false                                                                     2069           2077          11          5.1         197.3       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : false                                                                      841            882          49         12.5          80.2       2.5X

Running benchmark: Grouped HashAgg Exec: multiple group keys (cardinality 100), single aggregate SUM
  Running case: SQL Parquet - Spark (SUM) isANSIMode: false
  Stopped after 4 iterations, 2340 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: false
  Stopped after 8 iterations, 2320 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: multiple group keys (cardinality 100), single aggregate SUM:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: false                                                  574            585          12         18.3          54.8       1.0X
SQL Parquet - Comet (SUM) isANSIMode: false                                                  269            290          33         39.0          25.6       2.1X

Running benchmark: Grouped HashAgg Exec: multiple group keys (cardinality 1024), single aggregate SUM
  Running case: SQL Parquet - Spark (SUM) isANSIMode: false
  Stopped after 2 iterations, 5877 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: false
  Stopped after 2 iterations, 2924 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: multiple group keys (cardinality 1024), single aggregate SUM:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: false                                                  2896           2939          60          3.6         276.2       1.0X
SQL Parquet - Comet (SUM) isANSIMode: false                                                  1400           1462          88          7.5         133.5       2.1X

Running benchmark: Grouped HashAgg Exec: multiple group keys (cardinality 1048576), single aggregate SUM
  Running case: SQL Parquet - Spark (SUM) isANSIMode: false
   Stopped after 2 iterations, 13239 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: false
  Stopped after 2 iterations, 10603 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: multiple group keys (cardinality 1048576), single aggregate SUM:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: false                                                     6580           6620          57          1.6         627.5       1.0X
SQL Parquet - Comet (SUM) isANSIMode: false                                                     5265           5302          52          2.0         502.1       1.2X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 100), multiple aggregates SUM isANSIMode: false
  Running case: SQL Parquet - Spark (SUM) isANSIMode: false
  Stopped after 6 iterations, 2011 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: false
  Stopped after 9 iterations, 2165 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 100), multiple aggregates SUM isANSIMode: false:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: false                                                                    290            335          74         36.2          27.7       1.0X
SQL Parquet - Comet (SUM) isANSIMode: false                                                                    207            241          59         50.6          19.8       1.4X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1024), multiple aggregates SUM isANSIMode: false
  Running case: SQL Parquet - Spark (SUM) isANSIMode: false
  Stopped after 6 iterations, 2031 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: false
  Stopped after 9 iterations, 2281 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1024), multiple aggregates SUM isANSIMode: false:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: false                                                                     303            339          54         34.6          28.9       1.0X
SQL Parquet - Comet (SUM) isANSIMode: false                                                                     227            253          32         46.2          21.7       1.3X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1048576), multiple aggregates SUM isANSIMode: false
  Running case: SQL Parquet - Spark (SUM) isANSIMode: false
  Stopped after 2 iterations, 6469 ms
  Running case: SQL Parquet - Comet (SUM) isANSIMode: false
  Stopped after 2 iterations, 3608 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1048576), multiple aggregates SUM isANSIMode: false:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) isANSIMode: false                                                                       3222           3235          18          3.3         307.3       1.0X
SQL Parquet - Comet (SUM) isANSIMode: false                                                                       1562           1804         343          6.7         148.9       2.1X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM on decimal
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : false
  Stopped after 2 iterations, 2433 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : false
  Stopped after 8 iterations, 2034 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 100), single aggregate SUM on decimal:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : false                                                 1210           1217          10          8.7         115.4       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : false                                                  249            254           4         42.0          23.8       4.9X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM on decimal
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : false
  Stopped after 2 iterations, 2483 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : false
  Stopped after 7 iterations, 2099 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1024), single aggregate SUM on decimal:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : false                                                  1235           1242          10          8.5         117.7       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : false                                                   255            300          54         41.2          24.3       4.8X

Running benchmark: Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM on decimal
  Running case: SQL Parquet - Spark (SUM) ansi mode enabled : false
  Stopped after 2 iterations, 8194 ms
  Running case: SQL Parquet - Comet (SUM) ansi mode enabled : false
  Stopped after 2 iterations, 2820 ms

OpenJDK 64-Bit Server VM 17.0.16+8-LTS on Mac OS X 16.0
Apple M2 Max
Grouped HashAgg Exec: single group key (cardinality 1048576), single aggregate SUM on decimal:  Best Time(ms)   Avg Time(ms)   Stdev(ms)    Rate(M/s)   Per Row(ns)   Relative
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL Parquet - Spark (SUM) ansi mode enabled : false                                                     4069           4097          40          2.6         388.0       1.0X
SQL Parquet - Comet (SUM) ansi mode enabled : false                                                     1381           1410          42          7.6         131.7       2.9X

@coderfender
Copy link
Contributor Author

Rebased with main


// Check for overflow for early termination
if self.eval_mode == EvalMode::Try {
let that_has_all_nulls = states[1].as_boolean().value(0);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DF docs for merge_batch state:

    /// Updates the accumulator's state from an `Array` containing one
    /// or more intermediate values.

should there be a check that the input has more than one element before accessing state[1]?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the check here might be an overkill. We are guaranteeing that the accumulator's state is holding sum and has_all_nulls for Try eval mode as per Spark's semantics :

https://github.com/apache/datafusion-comet/pull/2600/changes#diff-21a43f466d9ae04ca6b3f7f64049a595f6705e9e4325965ec980ecd5f77ad036R231

self.resize_helper(total_num_groups);

let that_sums_is_all_nulls = if self.eval_mode == EvalMode::Try {
Some(values[1].as_boolean())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same question as earlier. Is values guaranteed to have length > 1 at this point?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the check here might be an overkill. We are guaranteeing that the group accumulator's state is holding sum and has_all_nulls for Try eval mode as per Spark's semantics

https://github.com/apache/datafusion-comet/pull/2600/changes#diff-21a43f466d9ae04ca6b3f7f64049a595f6705e9e4325965ec980ecd5f77ad036R467

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add ANSI support in SUM and AVG

5 participants