== Physical Plan ==
AdaptiveSparkPlan (117)
+- == Final Plan ==
   NativeTakeOrdered (75)
   +- NativeProject (74)
      +- NativeHashAggregate (73)
         +- InputAdapter (72)
            +- AQEShuffleRead (71)
               +- ShuffleQueryStage (70), Statistics(X)
                  +- NativeShuffleExchange (69)
                     +- NativeHashAggregate (68)
                        +- NativeProject (67)
                           +- NativeExpand (66)
                              +- NativeProject (65)
                                 +- NativeSortMergeJoin Inner (64)
                                    :- NativeSort (55)
                                    :  +- InputAdapter (54)
                                    :     +- AQEShuffleRead (53)
                                    :        +- ShuffleQueryStage (52), Statistics(X)
                                    :           +- NativeShuffleExchange (51)
                                    :              +- NativeProject (50)
                                    :                 +- NativeSortMergeJoin Inner (49)
                                    :                    :- NativeSort (40)
                                    :                    :  +- InputAdapter (39)
                                    :                    :     +- AQEShuffleRead (38)
                                    :                    :        +- ShuffleQueryStage (37), Statistics(X)
                                    :                    :           +- NativeShuffleExchange (36)
                                    :                    :              +- NativeProject (35)
                                    :                    :                 +- NativeSortMergeJoin Inner (34)
                                    :                    :                    :- NativeSort (24)
                                    :                    :                    :  +- InputAdapter (23)
                                    :                    :                    :     +- AQEShuffleRead (22)
                                    :                    :                    :        +- ShuffleQueryStage (21), Statistics(X)
                                    :                    :                    :           +- NativeShuffleExchange (20)
                                    :                    :                    :              +- NativeProject (19)
                                    :                    :                    :                 +- NativeSortMergeJoin Inner (18)
                                    :                    :                    :                    :- NativeSort (8)
                                    :                    :                    :                    :  +- InputAdapter (7)
                                    :                    :                    :                    :     +- AQEShuffleRead (6)
                                    :                    :                    :                    :        +- ShuffleQueryStage (5), Statistics(X)
                                    :                    :                    :                    :           +- NativeShuffleExchange (4)
                                    :                    :                    :                    :              +- NativeFilter (3)
                                    :                    :                    :                    :                 +- InputAdapter (2)
                                    :                    :                    :                    :                    +- NativeParquetScan  (1)
                                    :                    :                    :                    +- NativeSort (17)
                                    :                    :                    :                       +- InputAdapter (16)
                                    :                    :                    :                          +- AQEShuffleRead (15)
                                    :                    :                    :                             +- ShuffleQueryStage (14), Statistics(X)
                                    :                    :                    :                                +- NativeShuffleExchange (13)
                                    :                    :                    :                                   +- NativeProject (12)
                                    :                    :                    :                                      +- NativeFilter (11)
                                    :                    :                    :                                         +- InputAdapter (10)
                                    :                    :                    :                                            +- NativeParquetScan  (9)
                                    :                    :                    +- NativeSort (33)
                                    :                    :                       +- InputAdapter (32)
                                    :                    :                          +- AQEShuffleRead (31)
                                    :                    :                             +- ShuffleQueryStage (30), Statistics(X)
                                    :                    :                                +- NativeShuffleExchange (29)
                                    :                    :                                   +- NativeProject (28)
                                    :                    :                                      +- NativeFilter (27)
                                    :                    :                                         +- InputAdapter (26)
                                    :                    :                                            +- NativeParquetScan  (25)
                                    :                    +- NativeSort (48)
                                    :                       +- InputAdapter (47)
                                    :                          +- AQEShuffleRead (46)
                                    :                             +- ShuffleQueryStage (45), Statistics(X)
                                    :                                +- NativeShuffleExchange (44)
                                    :                                   +- NativeFilter (43)
                                    :                                      +- InputAdapter (42)
                                    :                                         +- NativeParquetScan  (41)
                                    +- NativeSort (63)
                                       +- InputAdapter (62)
                                          +- AQEShuffleRead (61)
                                             +- ShuffleQueryStage (60), Statistics(X)
                                                +- NativeShuffleExchange (59)
                                                   +- NativeFilter (58)
                                                      +- InputAdapter (57)
                                                         +- NativeParquetScan  (56)
+- == Initial Plan ==
   TakeOrderedAndProject (116)
   +- HashAggregate (115)
      +- Exchange (114)
         +- HashAggregate (113)
            +- Expand (112)
               +- Project (111)
                  +- SortMergeJoin Inner (110)
                     :- Sort (105)
                     :  +- Exchange (104)
                     :     +- Project (103)
                     :        +- SortMergeJoin Inner (102)
                     :           :- Sort (97)
                     :           :  +- Exchange (96)
                     :           :     +- Project (95)
                     :           :        +- SortMergeJoin Inner (94)
                     :           :           :- Sort (88)
                     :           :           :  +- Exchange (87)
                     :           :           :     +- Project (86)
                     :           :           :        +- SortMergeJoin Inner (85)
                     :           :           :           :- Sort (79)
                     :           :           :           :  +- Exchange (78)
                     :           :           :           :     +- Filter (77)
                     :           :           :           :        +- Scan parquet (76)
                     :           :           :           +- Sort (84)
                     :           :           :              +- Exchange (83)
                     :           :           :                 +- Project (82)
                     :           :           :                    +- Filter (81)
                     :           :           :                       +- Scan parquet (80)
                     :           :           +- Sort (93)
                     :           :              +- Exchange (92)
                     :           :                 +- Project (91)
                     :           :                    +- Filter (90)
                     :           :                       +- Scan parquet (89)
                     :           +- Sort (101)
                     :              +- Exchange (100)
                     :                 +- Filter (99)
                     :                    +- Scan parquet (98)
                     +- Sort (109)
                        +- Exchange (108)
                           +- Filter (107)
                              +- Scan parquet (106)


(76) Scan parquet
Output [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(ss_cdemo_sk), IsNotNull(ss_sold_date_sk), IsNotNull(ss_store_sk), IsNotNull(ss_item_sk)]
ReadSchema: struct<ss_sold_date_sk:int,ss_item_sk:int,ss_cdemo_sk:int,ss_store_sk:int,ss_quantity:int,ss_list_price:decimal(7,2),ss_sales_price:decimal(7,2),ss_coupon_amt:decimal(7,2)>

(2) InputAdapter
Input [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: [#1, #2, #3, #4, #5, #6, #7, #8]

(3) NativeFilter
Input [8]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8]
Condition : (((isnotnull(ss_cdemo_sk#3) AND isnotnull(ss_sold_date_sk#1)) AND isnotnull(ss_store_sk#4)) AND isnotnull(ss_item_sk#2))

(4) NativeShuffleExchange
Input [8]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8]
Arguments: hashpartitioning(ss_cdemo_sk#3, 100), ENSURE_REQUIREMENTS, [plan_id=1]

(5) ShuffleQueryStage
Output [8]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8]
Arguments: X

(6) AQEShuffleRead
Input [8]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8]
Arguments: coalesced

(7) InputAdapter
Input [8]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8]

(8) NativeSort
Input [8]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8]
Arguments: [ss_cdemo_sk#3 ASC NULLS FIRST], false

(80) Scan parquet
Output [4]: [cd_demo_sk#9, cd_gender#10, cd_marital_status#11, cd_education_status#12]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(cd_gender), IsNotNull(cd_marital_status), IsNotNull(cd_education_status), EqualTo(cd_gender,M), EqualTo(cd_marital_status,S), EqualTo(cd_education_status,College), IsNotNull(cd_demo_sk)]
ReadSchema: struct<cd_demo_sk:int,cd_gender:string,cd_marital_status:string,cd_education_status:string>

(10) InputAdapter
Input [4]: [cd_demo_sk#9, cd_gender#10, cd_marital_status#11, cd_education_status#12]
Arguments: [#9, #10, #11, #12]

(11) NativeFilter
Input [4]: [#9#9, #10#10, #11#11, #12#12]
Condition : ((((((isnotnull(cd_gender#10) AND isnotnull(cd_marital_status#11)) AND isnotnull(cd_education_status#12)) AND (cd_gender#10 = M)) AND (cd_marital_status#11 = S)) AND (cd_education_status#12 = College)) AND isnotnull(cd_demo_sk#9))

(12) NativeProject
Output [1]: [cd_demo_sk#9]
Input [4]: [#9#9, #10#10, #11#11, #12#12]

(13) NativeShuffleExchange
Input [1]: [cd_demo_sk#9]
Arguments: hashpartitioning(cd_demo_sk#9, 100), ENSURE_REQUIREMENTS, [plan_id=2]

(14) ShuffleQueryStage
Output [1]: [cd_demo_sk#9]
Arguments: X

(15) AQEShuffleRead
Input [1]: [cd_demo_sk#9]
Arguments: coalesced

(16) InputAdapter
Input [1]: [cd_demo_sk#9]

(17) NativeSort
Input [1]: [cd_demo_sk#9]
Arguments: [cd_demo_sk#9 ASC NULLS FIRST], false

(18) NativeSortMergeJoin
Left keys [1]: [ss_cdemo_sk#3]
Right keys [1]: [cd_demo_sk#9]
Join type: Inner
Join condition: None

(19) NativeProject
Output [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Input [9]: [#1#1, #2#2, #3#3, #4#4, #5#5, #6#6, #7#7, #8#8, cd_demo_sk#9]

(20) NativeShuffleExchange
Input [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: hashpartitioning(ss_sold_date_sk#1, 100), ENSURE_REQUIREMENTS, [plan_id=3]

(21) ShuffleQueryStage
Output [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: X

(22) AQEShuffleRead
Input [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: coalesced

(23) InputAdapter
Input [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]

(24) NativeSort
Input [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: [ss_sold_date_sk#1 ASC NULLS FIRST], false

(89) Scan parquet
Output [2]: [d_date_sk#13, d_year#14]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(26) InputAdapter
Input [2]: [d_date_sk#13, d_year#14]
Arguments: [#13, #14]

(27) NativeFilter
Input [2]: [#13#13, #14#14]
Condition : ((isnotnull(d_year#14) AND (d_year#14 = 2002)) AND isnotnull(d_date_sk#13))

(28) NativeProject
Output [1]: [d_date_sk#13]
Input [2]: [#13#13, #14#14]

(29) NativeShuffleExchange
Input [1]: [d_date_sk#13]
Arguments: hashpartitioning(d_date_sk#13, 100), ENSURE_REQUIREMENTS, [plan_id=4]

(30) ShuffleQueryStage
Output [1]: [d_date_sk#13]
Arguments: X

(31) AQEShuffleRead
Input [1]: [d_date_sk#13]
Arguments: coalesced

(32) InputAdapter
Input [1]: [d_date_sk#13]

(33) NativeSort
Input [1]: [d_date_sk#13]
Arguments: [d_date_sk#13 ASC NULLS FIRST], false

(34) NativeSortMergeJoin
Left keys [1]: [ss_sold_date_sk#1]
Right keys [1]: [d_date_sk#13]
Join type: Inner
Join condition: None

(35) NativeProject
Output [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Input [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, d_date_sk#13]

(36) NativeShuffleExchange
Input [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: hashpartitioning(ss_store_sk#4, 100), ENSURE_REQUIREMENTS, [plan_id=5]

(37) ShuffleQueryStage
Output [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: X

(38) AQEShuffleRead
Input [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: coalesced

(39) InputAdapter
Input [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]

(40) NativeSort
Input [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: [ss_store_sk#4 ASC NULLS FIRST], false

(98) Scan parquet
Output [2]: [s_store_sk#15, s_state#16]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(s_state), EqualTo(s_state,TN), IsNotNull(s_store_sk)]
ReadSchema: struct<s_store_sk:int,s_state:string>

(42) InputAdapter
Input [2]: [s_store_sk#15, s_state#16]
Arguments: [#15, #16]

(43) NativeFilter
Input [2]: [#15#15, #16#16]
Condition : ((isnotnull(s_state#16) AND (s_state#16 = TN)) AND isnotnull(s_store_sk#15))

(44) NativeShuffleExchange
Input [2]: [#15#15, #16#16]
Arguments: hashpartitioning(s_store_sk#15, 100), ENSURE_REQUIREMENTS, [plan_id=6]

(45) ShuffleQueryStage
Output [2]: [#15#15, #16#16]
Arguments: X

(46) AQEShuffleRead
Input [2]: [#15#15, #16#16]
Arguments: coalesced

(47) InputAdapter
Input [2]: [#15#15, #16#16]

(48) NativeSort
Input [2]: [#15#15, #16#16]
Arguments: [s_store_sk#15 ASC NULLS FIRST], false

(49) NativeSortMergeJoin
Left keys [1]: [ss_store_sk#4]
Right keys [1]: [s_store_sk#15]
Join type: Inner
Join condition: None

(50) NativeProject
Output [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Input [8]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, #15#15, #16#16]

(51) NativeShuffleExchange
Input [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Arguments: hashpartitioning(ss_item_sk#2, 100), ENSURE_REQUIREMENTS, [plan_id=7]

(52) ShuffleQueryStage
Output [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Arguments: X

(53) AQEShuffleRead
Input [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Arguments: coalesced

(54) InputAdapter
Input [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]

(55) NativeSort
Input [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Arguments: [ss_item_sk#2 ASC NULLS FIRST], false

(106) Scan parquet
Output [2]: [i_item_sk#17, i_item_id#18]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_item_id:string>

(57) InputAdapter
Input [2]: [i_item_sk#17, i_item_id#18]
Arguments: [#17, #18]

(58) NativeFilter
Input [2]: [#17#17, #18#18]
Condition : isnotnull(i_item_sk#17)

(59) NativeShuffleExchange
Input [2]: [#17#17, #18#18]
Arguments: hashpartitioning(i_item_sk#17, 100), ENSURE_REQUIREMENTS, [plan_id=8]

(60) ShuffleQueryStage
Output [2]: [#17#17, #18#18]
Arguments: X

(61) AQEShuffleRead
Input [2]: [#17#17, #18#18]
Arguments: coalesced

(62) InputAdapter
Input [2]: [#17#17, #18#18]

(63) NativeSort
Input [2]: [#17#17, #18#18]
Arguments: [i_item_sk#17 ASC NULLS FIRST], false

(64) NativeSortMergeJoin
Left keys [1]: [ss_item_sk#2]
Right keys [1]: [i_item_sk#17]
Join type: Inner
Join condition: None

(65) NativeProject
Output [6]: [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, s_state#16]
Input [8]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16, #17#17, #18#18]

(66) NativeExpand
Input [6]: [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, s_state#16]
Arguments: [[ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, s_state#16, 0], [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, null, 1], [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, null, null, 3]], [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#19, s_state#20, spark_grouping_id#21]

(67) NativeProject
Output [7]: [i_item_id#19 AS i_item_id#19, s_state#20 AS s_state#20, spark_grouping_id#21 AS spark_grouping_id#21, ss_quantity#5 AS _c3#22, UnscaledValue(ss_list_price#6) AS _c4#23, UnscaledValue(ss_coupon_amt#8) AS _c5#24, UnscaledValue(ss_sales_price#7) AS _c6#25]
Input [7]: [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#19, s_state#20, spark_grouping_id#21]

(68) NativeHashAggregate
Input [7]: [i_item_id#19, s_state#20, spark_grouping_id#21, _c3#22, _c4#23, _c5#24, _c6#25]
Keys [3]: [i_item_id#19, s_state#20, spark_grouping_id#21]
Functions [4]: [partial_avg(_c3#22), partial_avg(_c4#23), partial_avg(_c5#24), partial_avg(_c6#25)]
Aggregate Attributes [8]: [sum#26, count#27, sum#28, count#29, sum#30, count#31, sum#32, count#33]
Results [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, #34, #35, #34, #35, #34, #35, #34, #35]

(69) NativeShuffleExchange
Input [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, #34, #35, #34, #35, #34, #35, #34, #35]
Arguments: hashpartitioning(i_item_id#19, s_state#20, spark_grouping_id#21, 100), ENSURE_REQUIREMENTS, [plan_id=9]

(70) ShuffleQueryStage
Output [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, #34, #35, #34, #35, #34, #35, #34, #35]
Arguments: X

(71) AQEShuffleRead
Input [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, #34, #35, #34, #35, #34, #35, #34, #35]
Arguments: coalesced

(72) InputAdapter
Input [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, #34, #35, #34, #35, #34, #35, #34, #35]

(73) NativeHashAggregate
Input [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, #34, #35, #34, #35, #34, #35, #34, #35]
Keys [3]: [i_item_id#19, s_state#20, spark_grouping_id#21]
Functions [4]: [avg(ss_quantity#5), avg(UnscaledValue(ss_list_price#6)), avg(UnscaledValue(ss_coupon_amt#8)), avg(UnscaledValue(ss_sales_price#7))]
Aggregate Attributes [4]: [avg(ss_quantity#5)#36, avg(UnscaledValue(ss_list_price#6))#37, avg(UnscaledValue(ss_coupon_amt#8))#38, avg(UnscaledValue(ss_sales_price#7))#39]
Results [7]: [i_item_id#19, s_state#20, spark_grouping_id#21, avg(ss_quantity#5)#36, avg(UnscaledValue(ss_list_price#6))#37, avg(UnscaledValue(ss_coupon_amt#8))#38, avg(UnscaledValue(ss_sales_price#7))#39]

(74) NativeProject
Output [7]: [i_item_id#19, s_state#20, cast((shiftright(spark_grouping_id#21, 0) & 1) as tinyint) AS g_state#40, avg(ss_quantity#5)#36 AS agg1#41, cast((avg(UnscaledValue(ss_list_price#6))#37 / 100.0) as decimal(11,6)) AS agg2#42, cast((avg(UnscaledValue(ss_coupon_amt#8))#38 / 100.0) as decimal(11,6)) AS agg3#43, cast((avg(UnscaledValue(ss_sales_price#7))#39 / 100.0) as decimal(11,6)) AS agg4#44]
Input [7]: [i_item_id#19, s_state#20, spark_grouping_id#21, avg(ss_quantity#5)#36, avg(UnscaledValue(ss_list_price#6))#37, avg(UnscaledValue(ss_coupon_amt#8))#38, avg(UnscaledValue(ss_sales_price#7))#39]

(75) NativeTakeOrdered
Input [7]: [i_item_id#19, s_state#20, g_state#40, agg1#41, agg2#42, agg3#43, agg4#44]
Arguments: X, X, [i_item_id#19 ASC NULLS FIRST, s_state#20 ASC NULLS FIRST]

(76) Scan parquet
Output [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(ss_cdemo_sk), IsNotNull(ss_sold_date_sk), IsNotNull(ss_store_sk), IsNotNull(ss_item_sk)]
ReadSchema: struct<ss_sold_date_sk:int,ss_item_sk:int,ss_cdemo_sk:int,ss_store_sk:int,ss_quantity:int,ss_list_price:decimal(7,2),ss_sales_price:decimal(7,2),ss_coupon_amt:decimal(7,2)>

(77) Filter
Input [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Condition : (((isnotnull(ss_cdemo_sk#3) AND isnotnull(ss_sold_date_sk#1)) AND isnotnull(ss_store_sk#4)) AND isnotnull(ss_item_sk#2))

(78) Exchange
Input [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: hashpartitioning(ss_cdemo_sk#3, 100), ENSURE_REQUIREMENTS, [plan_id=10]

(79) Sort
Input [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: [ss_cdemo_sk#3 ASC NULLS FIRST], false, 0

(80) Scan parquet
Output [4]: [cd_demo_sk#9, cd_gender#10, cd_marital_status#11, cd_education_status#12]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(cd_gender), IsNotNull(cd_marital_status), IsNotNull(cd_education_status), EqualTo(cd_gender,M), EqualTo(cd_marital_status,S), EqualTo(cd_education_status,College), IsNotNull(cd_demo_sk)]
ReadSchema: struct<cd_demo_sk:int,cd_gender:string,cd_marital_status:string,cd_education_status:string>

(81) Filter
Input [4]: [cd_demo_sk#9, cd_gender#10, cd_marital_status#11, cd_education_status#12]
Condition : ((((((isnotnull(cd_gender#10) AND isnotnull(cd_marital_status#11)) AND isnotnull(cd_education_status#12)) AND (cd_gender#10 = M)) AND (cd_marital_status#11 = S)) AND (cd_education_status#12 = College)) AND isnotnull(cd_demo_sk#9))

(82) Project
Output [1]: [cd_demo_sk#9]
Input [4]: [cd_demo_sk#9, cd_gender#10, cd_marital_status#11, cd_education_status#12]

(83) Exchange
Input [1]: [cd_demo_sk#9]
Arguments: hashpartitioning(cd_demo_sk#9, 100), ENSURE_REQUIREMENTS, [plan_id=11]

(84) Sort
Input [1]: [cd_demo_sk#9]
Arguments: [cd_demo_sk#9 ASC NULLS FIRST], false, 0

(85) SortMergeJoin
Left keys [1]: [ss_cdemo_sk#3]
Right keys [1]: [cd_demo_sk#9]
Join type: Inner
Join condition: None

(86) Project
Output [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Input [9]: [ss_sold_date_sk#1, ss_item_sk#2, ss_cdemo_sk#3, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, cd_demo_sk#9]

(87) Exchange
Input [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: hashpartitioning(ss_sold_date_sk#1, 100), ENSURE_REQUIREMENTS, [plan_id=12]

(88) Sort
Input [7]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: [ss_sold_date_sk#1 ASC NULLS FIRST], false, 0

(89) Scan parquet
Output [2]: [d_date_sk#13, d_year#14]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(90) Filter
Input [2]: [d_date_sk#13, d_year#14]
Condition : ((isnotnull(d_year#14) AND (d_year#14 = 2002)) AND isnotnull(d_date_sk#13))

(91) Project
Output [1]: [d_date_sk#13]
Input [2]: [d_date_sk#13, d_year#14]

(92) Exchange
Input [1]: [d_date_sk#13]
Arguments: hashpartitioning(d_date_sk#13, 100), ENSURE_REQUIREMENTS, [plan_id=13]

(93) Sort
Input [1]: [d_date_sk#13]
Arguments: [d_date_sk#13 ASC NULLS FIRST], false, 0

(94) SortMergeJoin
Left keys [1]: [ss_sold_date_sk#1]
Right keys [1]: [d_date_sk#13]
Join type: Inner
Join condition: None

(95) Project
Output [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Input [8]: [ss_sold_date_sk#1, ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, d_date_sk#13]

(96) Exchange
Input [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: hashpartitioning(ss_store_sk#4, 100), ENSURE_REQUIREMENTS, [plan_id=14]

(97) Sort
Input [6]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8]
Arguments: [ss_store_sk#4 ASC NULLS FIRST], false, 0

(98) Scan parquet
Output [2]: [s_store_sk#15, s_state#16]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(s_state), EqualTo(s_state,TN), IsNotNull(s_store_sk)]
ReadSchema: struct<s_store_sk:int,s_state:string>

(99) Filter
Input [2]: [s_store_sk#15, s_state#16]
Condition : ((isnotnull(s_state#16) AND (s_state#16 = TN)) AND isnotnull(s_store_sk#15))

(100) Exchange
Input [2]: [s_store_sk#15, s_state#16]
Arguments: hashpartitioning(s_store_sk#15, 100), ENSURE_REQUIREMENTS, [plan_id=15]

(101) Sort
Input [2]: [s_store_sk#15, s_state#16]
Arguments: [s_store_sk#15 ASC NULLS FIRST], false, 0

(102) SortMergeJoin
Left keys [1]: [ss_store_sk#4]
Right keys [1]: [s_store_sk#15]
Join type: Inner
Join condition: None

(103) Project
Output [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Input [8]: [ss_item_sk#2, ss_store_sk#4, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_store_sk#15, s_state#16]

(104) Exchange
Input [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Arguments: hashpartitioning(ss_item_sk#2, 100), ENSURE_REQUIREMENTS, [plan_id=16]

(105) Sort
Input [6]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16]
Arguments: [ss_item_sk#2 ASC NULLS FIRST], false, 0

(106) Scan parquet
Output [2]: [i_item_sk#17, i_item_id#18]
Batched: true
Location: InMemoryFileIndex [file:/<warehouse_dir>]
PushedFilters: [IsNotNull(i_item_sk)]
ReadSchema: struct<i_item_sk:int,i_item_id:string>

(107) Filter
Input [2]: [i_item_sk#17, i_item_id#18]
Condition : isnotnull(i_item_sk#17)

(108) Exchange
Input [2]: [i_item_sk#17, i_item_id#18]
Arguments: hashpartitioning(i_item_sk#17, 100), ENSURE_REQUIREMENTS, [plan_id=17]

(109) Sort
Input [2]: [i_item_sk#17, i_item_id#18]
Arguments: [i_item_sk#17 ASC NULLS FIRST], false, 0

(110) SortMergeJoin
Left keys [1]: [ss_item_sk#2]
Right keys [1]: [i_item_sk#17]
Join type: Inner
Join condition: None

(111) Project
Output [6]: [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, s_state#16]
Input [8]: [ss_item_sk#2, ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, s_state#16, i_item_sk#17, i_item_id#18]

(112) Expand
Input [6]: [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, s_state#16]
Arguments: [[ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, s_state#16, 0], [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#18, null, 1], [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, null, null, 3]], [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#19, s_state#20, spark_grouping_id#21]

(113) HashAggregate
Input [7]: [ss_quantity#5, ss_list_price#6, ss_sales_price#7, ss_coupon_amt#8, i_item_id#19, s_state#20, spark_grouping_id#21]
Keys [3]: [i_item_id#19, s_state#20, spark_grouping_id#21]
Functions [4]: [partial_avg(ss_quantity#5), partial_avg(UnscaledValue(ss_list_price#6)), partial_avg(UnscaledValue(ss_coupon_amt#8)), partial_avg(UnscaledValue(ss_sales_price#7))]
Aggregate Attributes [8]: [sum#26, count#27, sum#28, count#29, sum#30, count#31, sum#32, count#33]
Results [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, sum#45, count#46, sum#47, count#48, sum#49, count#50, sum#51, count#52]

(114) Exchange
Input [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, sum#45, count#46, sum#47, count#48, sum#49, count#50, sum#51, count#52]
Arguments: hashpartitioning(i_item_id#19, s_state#20, spark_grouping_id#21, 100), ENSURE_REQUIREMENTS, [plan_id=18]

(115) HashAggregate
Input [11]: [i_item_id#19, s_state#20, spark_grouping_id#21, sum#45, count#46, sum#47, count#48, sum#49, count#50, sum#51, count#52]
Keys [3]: [i_item_id#19, s_state#20, spark_grouping_id#21]
Functions [4]: [avg(ss_quantity#5), avg(UnscaledValue(ss_list_price#6)), avg(UnscaledValue(ss_coupon_amt#8)), avg(UnscaledValue(ss_sales_price#7))]
Aggregate Attributes [4]: [avg(ss_quantity#5)#36, avg(UnscaledValue(ss_list_price#6))#37, avg(UnscaledValue(ss_coupon_amt#8))#38, avg(UnscaledValue(ss_sales_price#7))#39]
Results [7]: [i_item_id#19, s_state#20, cast((shiftright(spark_grouping_id#21, 0) & 1) as tinyint) AS g_state#40, avg(ss_quantity#5)#36 AS agg1#41, cast((avg(UnscaledValue(ss_list_price#6))#37 / 100.0) as decimal(11,6)) AS agg2#42, cast((avg(UnscaledValue(ss_coupon_amt#8))#38 / 100.0) as decimal(11,6)) AS agg3#43, cast((avg(UnscaledValue(ss_sales_price#7))#39 / 100.0) as decimal(11,6)) AS agg4#44]

(116) TakeOrderedAndProject
Input [7]: [i_item_id#19, s_state#20, g_state#40, agg1#41, agg2#42, agg3#43, agg4#44]
Arguments: X, [i_item_id#19 ASC NULLS FIRST, s_state#20 ASC NULLS FIRST], [i_item_id#19, s_state#20, g_state#40, agg1#41, agg2#42, agg3#43, agg4#44]

(117) AdaptiveSparkPlan
Output [7]: [i_item_id#19, s_state#20, g_state#40, agg1#41, agg2#42, agg3#43, agg4#44]
Arguments: isFinalPlan=true

