== Physical Plan ==
VeloxColumnarToRow (118)
+- TakeOrderedAndProjectExecTransformer (117)
   +- ^ ProjectExecTransformer (115)
      +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (114)
         :- ^ ProjectExecTransformer (85)
         :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (84)
         :     :- ^ BroadcastHashJoinExecTransformer Inner BuildRight (54)
         :     :  :- ^ FilterExecTransformer (25)
         :     :  :  +- ^ ProjectExecTransformer (24)
         :     :  :     +- ^ RegularHashAggregateExecTransformer (23)
         :     :  :        +- ^ InputIteratorTransformer (22)
         :     :  :           +- ColumnarExchange (20)
         :     :  :              +- VeloxResizeBatches (19)
         :     :  :                 +- ^ ProjectExecTransformer (17)
         :     :  :                    +- ^ FlushableHashAggregateExecTransformer (16)
         :     :  :                       +- ^ ProjectExecTransformer (15)
         :     :  :                          +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (14)
         :     :  :                             :- ^ ProjectExecTransformer (10)
         :     :  :                             :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (9)
         :     :  :                             :     :- ^ FilterExecTransformer (2)
         :     :  :                             :     :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer (1)
         :     :  :                             :     +- ^ InputIteratorTransformer (8)
         :     :  :                             :        +- ColumnarBroadcastExchange (6)
         :     :  :                             :           +- ^ FilterExecTransformer (4)
         :     :  :                             :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.store_sales (3)
         :     :  :                             +- ^ InputIteratorTransformer (13)
         :     :  :                                +- ReusedExchange (11)
         :     :  +- ^ InputIteratorTransformer (53)
         :     :     +- ColumnarBroadcastExchange (51)
         :     :        +- ^ ProjectExecTransformer (49)
         :     :           +- ^ RegularHashAggregateExecTransformer (48)
         :     :              +- ^ InputIteratorTransformer (47)
         :     :                 +- ColumnarExchange (45)
         :     :                    +- VeloxResizeBatches (44)
         :     :                       +- ^ ProjectExecTransformer (42)
         :     :                          +- ^ FlushableHashAggregateExecTransformer (41)
         :     :                             +- ^ ProjectExecTransformer (40)
         :     :                                +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (39)
         :     :                                   :- ^ ProjectExecTransformer (35)
         :     :                                   :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (34)
         :     :                                   :     :- ^ FilterExecTransformer (27)
         :     :                                   :     :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer (26)
         :     :                                   :     +- ^ InputIteratorTransformer (33)
         :     :                                   :        +- ColumnarBroadcastExchange (31)
         :     :                                   :           +- ^ FilterExecTransformer (29)
         :     :                                   :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.store_sales (28)
         :     :                                   +- ^ InputIteratorTransformer (38)
         :     :                                      +- ReusedExchange (36)
         :     +- ^ InputIteratorTransformer (83)
         :        +- ColumnarBroadcastExchange (81)
         :           +- ^ FilterExecTransformer (79)
         :              +- ^ ProjectExecTransformer (78)
         :                 +- ^ RegularHashAggregateExecTransformer (77)
         :                    +- ^ InputIteratorTransformer (76)
         :                       +- ColumnarExchange (74)
         :                          +- VeloxResizeBatches (73)
         :                             +- ^ ProjectExecTransformer (71)
         :                                +- ^ FlushableHashAggregateExecTransformer (70)
         :                                   +- ^ ProjectExecTransformer (69)
         :                                      +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (68)
         :                                         :- ^ ProjectExecTransformer (64)
         :                                         :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (63)
         :                                         :     :- ^ FilterExecTransformer (56)
         :                                         :     :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer (55)
         :                                         :     +- ^ InputIteratorTransformer (62)
         :                                         :        +- ColumnarBroadcastExchange (60)
         :                                         :           +- ^ FilterExecTransformer (58)
         :                                         :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_sales (57)
         :                                         +- ^ InputIteratorTransformer (67)
         :                                            +- ReusedExchange (65)
         +- ^ InputIteratorTransformer (113)
            +- ColumnarBroadcastExchange (111)
               +- ^ ProjectExecTransformer (109)
                  +- ^ RegularHashAggregateExecTransformer (108)
                     +- ^ InputIteratorTransformer (107)
                        +- ColumnarExchange (105)
                           +- VeloxResizeBatches (104)
                              +- ^ ProjectExecTransformer (102)
                                 +- ^ FlushableHashAggregateExecTransformer (101)
                                    +- ^ ProjectExecTransformer (100)
                                       +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (99)
                                          :- ^ ProjectExecTransformer (95)
                                          :  +- ^ BroadcastHashJoinExecTransformer Inner BuildRight (94)
                                          :     :- ^ FilterExecTransformer (87)
                                          :     :  +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.customer (86)
                                          :     +- ^ InputIteratorTransformer (93)
                                          :        +- ColumnarBroadcastExchange (91)
                                          :           +- ^ FilterExecTransformer (89)
                                          :              +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.web_sales (88)
                                          +- ^ InputIteratorTransformer (98)
                                             +- ReusedExchange (96)


(1) FileSourceScanExecTransformer parquet spark_catalog.default.customer
Output [4]: [c_customer_sk#1, c_customer_id#2, c_first_name#3, c_last_name#4]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_customer_id)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_first_name:string,c_last_name:string>

(2) FilterExecTransformer
Input [4]: [c_customer_sk#1, c_customer_id#2, c_first_name#3, c_last_name#4]
Arguments: (isnotnull(c_customer_sk#1) AND isnotnull(c_customer_id#2))

(3) FileSourceScanExecTransformer parquet spark_catalog.default.store_sales
Output [3]: [ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#7), dynamicpruningexpression(ss_sold_date_sk#7 IN dynamicpruning#8)]
PushedFilters: [IsNotNull(ss_customer_sk)]
ReadSchema: struct<ss_customer_sk:int,ss_net_paid:decimal(7,2)>

(4) FilterExecTransformer
Input [3]: [ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]
Arguments: isnotnull(ss_customer_sk#5)

(5) WholeStageCodegenTransformer (2)
Input [3]: [ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]
Arguments: false

(6) ColumnarBroadcastExchange
Input [3]: [ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=1]

(7) InputAdapter
Input [3]: [ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]

(8) InputIteratorTransformer
Input [3]: [ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]

(9) BroadcastHashJoinExecTransformer
Left keys [1]: [c_customer_sk#1]
Right keys [1]: [ss_customer_sk#5]
Join type: Inner
Join condition: None

(10) ProjectExecTransformer
Output [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, ss_net_paid#6, ss_sold_date_sk#7]
Input [7]: [c_customer_sk#1, c_customer_id#2, c_first_name#3, c_last_name#4, ss_customer_sk#5, ss_net_paid#6, ss_sold_date_sk#7]

(11) ReusedExchange [Reuses operator id: 122]
Output [2]: [d_date_sk#9, d_year#10]

(12) InputAdapter
Input [2]: [d_date_sk#9, d_year#10]

(13) InputIteratorTransformer
Input [2]: [d_date_sk#9, d_year#10]

(14) BroadcastHashJoinExecTransformer
Left keys [1]: [ss_sold_date_sk#7]
Right keys [1]: [d_date_sk#9]
Join type: Inner
Join condition: None

(15) ProjectExecTransformer
Output [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, UnscaledValue(ss_net_paid#6) AS _pre_1#11]
Input [7]: [c_customer_id#2, c_first_name#3, c_last_name#4, ss_net_paid#6, ss_sold_date_sk#7, d_date_sk#9, d_year#10]

(16) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, _pre_1#11]
Keys [4]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10]
Functions [1]: [partial_sum(_pre_1#11)]
Aggregate Attributes [1]: [sum#12]
Results [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]

(17) ProjectExecTransformer
Output [6]: [hash(c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, 42) AS hash_partition_key#14, c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]
Input [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]

(18) WholeStageCodegenTransformer (4)
Input [6]: [hash_partition_key#14, c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]
Arguments: false

(19) VeloxResizeBatches
Input [6]: [hash_partition_key#14, c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]
Arguments: 1024, 2147483647, 10485760

(20) ColumnarExchange
Input [6]: [hash_partition_key#14, c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]
Arguments: hashpartitioning(c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, 1), ENSURE_REQUIREMENTS, [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13], [plan_id=2], [shuffle_writer_type=hash]

(21) InputAdapter
Input [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]

(22) InputIteratorTransformer
Input [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]

(23) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum#13]
Keys [4]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10]
Functions [1]: [sum(UnscaledValue(ss_net_paid#6))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#6))#15]
Results [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum(UnscaledValue(ss_net_paid#6))#15]

(24) ProjectExecTransformer
Output [2]: [c_customer_id#2 AS customer_id#16, MakeDecimal(sum(UnscaledValue(ss_net_paid#6))#15,17,2) AS year_total#17]
Input [5]: [c_customer_id#2, c_first_name#3, c_last_name#4, d_year#10, sum(UnscaledValue(ss_net_paid#6))#15]

(25) FilterExecTransformer
Input [2]: [customer_id#16, year_total#17]
Arguments: (isnotnull(year_total#17) AND (year_total#17 > 0.00))

(26) FileSourceScanExecTransformer parquet spark_catalog.default.customer
Output [4]: [c_customer_sk#18, c_customer_id#19, c_first_name#20, c_last_name#21]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_customer_id)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_first_name:string,c_last_name:string>

(27) FilterExecTransformer
Input [4]: [c_customer_sk#18, c_customer_id#19, c_first_name#20, c_last_name#21]
Arguments: (isnotnull(c_customer_sk#18) AND isnotnull(c_customer_id#19))

(28) FileSourceScanExecTransformer parquet spark_catalog.default.store_sales
Output [3]: [ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ss_sold_date_sk#24), dynamicpruningexpression(ss_sold_date_sk#24 IN dynamicpruning#25)]
PushedFilters: [IsNotNull(ss_customer_sk)]
ReadSchema: struct<ss_customer_sk:int,ss_net_paid:decimal(7,2)>

(29) FilterExecTransformer
Input [3]: [ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]
Arguments: isnotnull(ss_customer_sk#22)

(30) WholeStageCodegenTransformer (6)
Input [3]: [ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]
Arguments: false

(31) ColumnarBroadcastExchange
Input [3]: [ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=3]

(32) InputAdapter
Input [3]: [ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]

(33) InputIteratorTransformer
Input [3]: [ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]

(34) BroadcastHashJoinExecTransformer
Left keys [1]: [c_customer_sk#18]
Right keys [1]: [ss_customer_sk#22]
Join type: Inner
Join condition: None

(35) ProjectExecTransformer
Output [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, ss_net_paid#23, ss_sold_date_sk#24]
Input [7]: [c_customer_sk#18, c_customer_id#19, c_first_name#20, c_last_name#21, ss_customer_sk#22, ss_net_paid#23, ss_sold_date_sk#24]

(36) ReusedExchange [Reuses operator id: 126]
Output [2]: [d_date_sk#26, d_year#27]

(37) InputAdapter
Input [2]: [d_date_sk#26, d_year#27]

(38) InputIteratorTransformer
Input [2]: [d_date_sk#26, d_year#27]

(39) BroadcastHashJoinExecTransformer
Left keys [1]: [ss_sold_date_sk#24]
Right keys [1]: [d_date_sk#26]
Join type: Inner
Join condition: None

(40) ProjectExecTransformer
Output [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, UnscaledValue(ss_net_paid#23) AS _pre_2#28]
Input [7]: [c_customer_id#19, c_first_name#20, c_last_name#21, ss_net_paid#23, ss_sold_date_sk#24, d_date_sk#26, d_year#27]

(41) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, _pre_2#28]
Keys [4]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27]
Functions [1]: [partial_sum(_pre_2#28)]
Aggregate Attributes [1]: [sum#29]
Results [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]

(42) ProjectExecTransformer
Output [6]: [hash(c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, 42) AS hash_partition_key#31, c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]
Input [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]

(43) WholeStageCodegenTransformer (8)
Input [6]: [hash_partition_key#31, c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]
Arguments: false

(44) VeloxResizeBatches
Input [6]: [hash_partition_key#31, c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]
Arguments: 1024, 2147483647, 10485760

(45) ColumnarExchange
Input [6]: [hash_partition_key#31, c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]
Arguments: hashpartitioning(c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, 1), ENSURE_REQUIREMENTS, [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30], [plan_id=4], [shuffle_writer_type=hash]

(46) InputAdapter
Input [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]

(47) InputIteratorTransformer
Input [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]

(48) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum#30]
Keys [4]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27]
Functions [1]: [sum(UnscaledValue(ss_net_paid#23))]
Aggregate Attributes [1]: [sum(UnscaledValue(ss_net_paid#23))#15]
Results [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum(UnscaledValue(ss_net_paid#23))#15]

(49) ProjectExecTransformer
Output [4]: [c_customer_id#19 AS customer_id#32, c_first_name#20 AS customer_first_name#33, c_last_name#21 AS customer_last_name#34, MakeDecimal(sum(UnscaledValue(ss_net_paid#23))#15,17,2) AS year_total#35]
Input [5]: [c_customer_id#19, c_first_name#20, c_last_name#21, d_year#27, sum(UnscaledValue(ss_net_paid#23))#15]

(50) WholeStageCodegenTransformer (9)
Input [4]: [customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35]
Arguments: false

(51) ColumnarBroadcastExchange
Input [4]: [customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=5]

(52) InputAdapter
Input [4]: [customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35]

(53) InputIteratorTransformer
Input [4]: [customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35]

(54) BroadcastHashJoinExecTransformer
Left keys [1]: [customer_id#16]
Right keys [1]: [customer_id#32]
Join type: Inner
Join condition: None

(55) FileSourceScanExecTransformer parquet spark_catalog.default.customer
Output [4]: [c_customer_sk#36, c_customer_id#37, c_first_name#38, c_last_name#39]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_customer_id)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_first_name:string,c_last_name:string>

(56) FilterExecTransformer
Input [4]: [c_customer_sk#36, c_customer_id#37, c_first_name#38, c_last_name#39]
Arguments: (isnotnull(c_customer_sk#36) AND isnotnull(c_customer_id#37))

(57) FileSourceScanExecTransformer parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#42), dynamicpruningexpression(ws_sold_date_sk#42 IN dynamicpruning#8)]
PushedFilters: [IsNotNull(ws_bill_customer_sk)]
ReadSchema: struct<ws_bill_customer_sk:int,ws_net_paid:decimal(7,2)>

(58) FilterExecTransformer
Input [3]: [ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]
Arguments: isnotnull(ws_bill_customer_sk#40)

(59) WholeStageCodegenTransformer (11)
Input [3]: [ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]
Arguments: false

(60) ColumnarBroadcastExchange
Input [3]: [ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=6]

(61) InputAdapter
Input [3]: [ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]

(62) InputIteratorTransformer
Input [3]: [ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]

(63) BroadcastHashJoinExecTransformer
Left keys [1]: [c_customer_sk#36]
Right keys [1]: [ws_bill_customer_sk#40]
Join type: Inner
Join condition: None

(64) ProjectExecTransformer
Output [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, ws_net_paid#41, ws_sold_date_sk#42]
Input [7]: [c_customer_sk#36, c_customer_id#37, c_first_name#38, c_last_name#39, ws_bill_customer_sk#40, ws_net_paid#41, ws_sold_date_sk#42]

(65) ReusedExchange [Reuses operator id: 122]
Output [2]: [d_date_sk#43, d_year#44]

(66) InputAdapter
Input [2]: [d_date_sk#43, d_year#44]

(67) InputIteratorTransformer
Input [2]: [d_date_sk#43, d_year#44]

(68) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_sold_date_sk#42]
Right keys [1]: [d_date_sk#43]
Join type: Inner
Join condition: None

(69) ProjectExecTransformer
Output [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, UnscaledValue(ws_net_paid#41) AS _pre_3#45]
Input [7]: [c_customer_id#37, c_first_name#38, c_last_name#39, ws_net_paid#41, ws_sold_date_sk#42, d_date_sk#43, d_year#44]

(70) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, _pre_3#45]
Keys [4]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44]
Functions [1]: [partial_sum(_pre_3#45)]
Aggregate Attributes [1]: [sum#46]
Results [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]

(71) ProjectExecTransformer
Output [6]: [hash(c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, 42) AS hash_partition_key#48, c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]
Input [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]

(72) WholeStageCodegenTransformer (13)
Input [6]: [hash_partition_key#48, c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]
Arguments: false

(73) VeloxResizeBatches
Input [6]: [hash_partition_key#48, c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]
Arguments: 1024, 2147483647, 10485760

(74) ColumnarExchange
Input [6]: [hash_partition_key#48, c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]
Arguments: hashpartitioning(c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, 1), ENSURE_REQUIREMENTS, [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47], [plan_id=7], [shuffle_writer_type=hash]

(75) InputAdapter
Input [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]

(76) InputIteratorTransformer
Input [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]

(77) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum#47]
Keys [4]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44]
Functions [1]: [sum(UnscaledValue(ws_net_paid#41))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_net_paid#41))#49]
Results [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum(UnscaledValue(ws_net_paid#41))#49]

(78) ProjectExecTransformer
Output [2]: [c_customer_id#37 AS customer_id#50, MakeDecimal(sum(UnscaledValue(ws_net_paid#41))#49,17,2) AS year_total#51]
Input [5]: [c_customer_id#37, c_first_name#38, c_last_name#39, d_year#44, sum(UnscaledValue(ws_net_paid#41))#49]

(79) FilterExecTransformer
Input [2]: [customer_id#50, year_total#51]
Arguments: (isnotnull(year_total#51) AND (year_total#51 > 0.00))

(80) WholeStageCodegenTransformer (14)
Input [2]: [customer_id#50, year_total#51]
Arguments: false

(81) ColumnarBroadcastExchange
Input [2]: [customer_id#50, year_total#51]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=8]

(82) InputAdapter
Input [2]: [customer_id#50, year_total#51]

(83) InputIteratorTransformer
Input [2]: [customer_id#50, year_total#51]

(84) BroadcastHashJoinExecTransformer
Left keys [1]: [customer_id#16]
Right keys [1]: [customer_id#50]
Join type: Inner
Join condition: None

(85) ProjectExecTransformer
Output [7]: [customer_id#16, year_total#17, customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35, year_total#51]
Input [8]: [customer_id#16, year_total#17, customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35, customer_id#50, year_total#51]

(86) FileSourceScanExecTransformer parquet spark_catalog.default.customer
Output [4]: [c_customer_sk#52, c_customer_id#53, c_first_name#54, c_last_name#55]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_customer_id)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_first_name:string,c_last_name:string>

(87) FilterExecTransformer
Input [4]: [c_customer_sk#52, c_customer_id#53, c_first_name#54, c_last_name#55]
Arguments: (isnotnull(c_customer_sk#52) AND isnotnull(c_customer_id#53))

(88) FileSourceScanExecTransformer parquet spark_catalog.default.web_sales
Output [3]: [ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(ws_sold_date_sk#58), dynamicpruningexpression(ws_sold_date_sk#58 IN dynamicpruning#25)]
PushedFilters: [IsNotNull(ws_bill_customer_sk)]
ReadSchema: struct<ws_bill_customer_sk:int,ws_net_paid:decimal(7,2)>

(89) FilterExecTransformer
Input [3]: [ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]
Arguments: isnotnull(ws_bill_customer_sk#56)

(90) WholeStageCodegenTransformer (16)
Input [3]: [ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]
Arguments: false

(91) ColumnarBroadcastExchange
Input [3]: [ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=9]

(92) InputAdapter
Input [3]: [ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]

(93) InputIteratorTransformer
Input [3]: [ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]

(94) BroadcastHashJoinExecTransformer
Left keys [1]: [c_customer_sk#52]
Right keys [1]: [ws_bill_customer_sk#56]
Join type: Inner
Join condition: None

(95) ProjectExecTransformer
Output [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, ws_net_paid#57, ws_sold_date_sk#58]
Input [7]: [c_customer_sk#52, c_customer_id#53, c_first_name#54, c_last_name#55, ws_bill_customer_sk#56, ws_net_paid#57, ws_sold_date_sk#58]

(96) ReusedExchange [Reuses operator id: 126]
Output [2]: [d_date_sk#59, d_year#60]

(97) InputAdapter
Input [2]: [d_date_sk#59, d_year#60]

(98) InputIteratorTransformer
Input [2]: [d_date_sk#59, d_year#60]

(99) BroadcastHashJoinExecTransformer
Left keys [1]: [ws_sold_date_sk#58]
Right keys [1]: [d_date_sk#59]
Join type: Inner
Join condition: None

(100) ProjectExecTransformer
Output [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, UnscaledValue(ws_net_paid#57) AS _pre_4#61]
Input [7]: [c_customer_id#53, c_first_name#54, c_last_name#55, ws_net_paid#57, ws_sold_date_sk#58, d_date_sk#59, d_year#60]

(101) FlushableHashAggregateExecTransformer
Input [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, _pre_4#61]
Keys [4]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60]
Functions [1]: [partial_sum(_pre_4#61)]
Aggregate Attributes [1]: [sum#62]
Results [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]

(102) ProjectExecTransformer
Output [6]: [hash(c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, 42) AS hash_partition_key#64, c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]
Input [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]

(103) WholeStageCodegenTransformer (18)
Input [6]: [hash_partition_key#64, c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]
Arguments: false

(104) VeloxResizeBatches
Input [6]: [hash_partition_key#64, c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]
Arguments: 1024, 2147483647, 10485760

(105) ColumnarExchange
Input [6]: [hash_partition_key#64, c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]
Arguments: hashpartitioning(c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, 1), ENSURE_REQUIREMENTS, [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63], [plan_id=10], [shuffle_writer_type=hash]

(106) InputAdapter
Input [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]

(107) InputIteratorTransformer
Input [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]

(108) RegularHashAggregateExecTransformer
Input [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum#63]
Keys [4]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60]
Functions [1]: [sum(UnscaledValue(ws_net_paid#57))]
Aggregate Attributes [1]: [sum(UnscaledValue(ws_net_paid#57))#49]
Results [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum(UnscaledValue(ws_net_paid#57))#49]

(109) ProjectExecTransformer
Output [2]: [c_customer_id#53 AS customer_id#65, MakeDecimal(sum(UnscaledValue(ws_net_paid#57))#49,17,2) AS year_total#66]
Input [5]: [c_customer_id#53, c_first_name#54, c_last_name#55, d_year#60, sum(UnscaledValue(ws_net_paid#57))#49]

(110) WholeStageCodegenTransformer (19)
Input [2]: [customer_id#65, year_total#66]
Arguments: false

(111) ColumnarBroadcastExchange
Input [2]: [customer_id#65, year_total#66]
Arguments: HashedRelationBroadcastMode(List(input[0, string, true]),false), [plan_id=11]

(112) InputAdapter
Input [2]: [customer_id#65, year_total#66]

(113) InputIteratorTransformer
Input [2]: [customer_id#65, year_total#66]

(114) BroadcastHashJoinExecTransformer
Left keys [1]: [customer_id#16]
Right keys [1]: [customer_id#65]
Join type: Inner
Join condition: (CASE WHEN (year_total#51 > 0.00) THEN (year_total#66 / year_total#51) END > CASE WHEN (year_total#17 > 0.00) THEN (year_total#35 / year_total#17) END)

(115) ProjectExecTransformer
Output [3]: [customer_id#32, customer_first_name#33, customer_last_name#34]
Input [9]: [customer_id#16, year_total#17, customer_id#32, customer_first_name#33, customer_last_name#34, year_total#35, year_total#51, customer_id#65, year_total#66]

(116) WholeStageCodegenTransformer (20)
Input [3]: [customer_id#32, customer_first_name#33, customer_last_name#34]
Arguments: false

(117) TakeOrderedAndProjectExecTransformer
Input [3]: [customer_id#32, customer_first_name#33, customer_last_name#34]
Arguments: 100, [customer_first_name#33 ASC NULLS FIRST, customer_id#32 ASC NULLS FIRST, customer_last_name#34 ASC NULLS FIRST], [customer_id#32, customer_first_name#33, customer_last_name#34], 0

(118) VeloxColumnarToRow
Input [3]: [customer_id#32, customer_first_name#33, customer_last_name#34]

===== Subqueries =====

Subquery:1 Hosting operator id = 3 Hosting Expression = ss_sold_date_sk#7 IN dynamicpruning#8
ColumnarBroadcastExchange (122)
+- ^ FilterExecTransformer (120)
   +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.date_dim (119)


(119) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#9, d_year#10]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2001), In(d_year, [2001,2002]), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(120) FilterExecTransformer
Input [2]: [d_date_sk#9, d_year#10]
Arguments: (((isnotnull(d_year#10) AND (d_year#10 = 2001)) AND d_year#10 IN (2001,2002)) AND isnotnull(d_date_sk#9))

(121) WholeStageCodegenTransformer (1)
Input [2]: [d_date_sk#9, d_year#10]
Arguments: false

(122) ColumnarBroadcastExchange
Input [2]: [d_date_sk#9, d_year#10]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=12]

Subquery:2 Hosting operator id = 28 Hosting Expression = ss_sold_date_sk#24 IN dynamicpruning#25
ColumnarBroadcastExchange (126)
+- ^ FilterExecTransformer (124)
   +- ^ FileSourceScanExecTransformer parquet spark_catalog.default.date_dim (123)


(123) FileSourceScanExecTransformer parquet spark_catalog.default.date_dim
Output [2]: [d_date_sk#26, d_year#27]
Batched: true
Location: InMemoryFileIndex [{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), In(d_year, [2001,2002]), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(124) FilterExecTransformer
Input [2]: [d_date_sk#26, d_year#27]
Arguments: (((isnotnull(d_year#27) AND (d_year#27 = 2002)) AND d_year#27 IN (2001,2002)) AND isnotnull(d_date_sk#26))

(125) WholeStageCodegenTransformer (5)
Input [2]: [d_date_sk#26, d_year#27]
Arguments: false

(126) ColumnarBroadcastExchange
Input [2]: [d_date_sk#26, d_year#27]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, false] as bigint)),false), [plan_id=13]

Subquery:3 Hosting operator id = 57 Hosting Expression = ws_sold_date_sk#42 IN dynamicpruning#8

Subquery:4 Hosting operator id = 88 Hosting Expression = ws_sold_date_sk#58 IN dynamicpruning#25


