== Physical Plan ==
TakeOrderedAndProject (55)
+- * Project (54)
   +- * BroadcastHashJoin Inner BuildRight (53)
      :- * Project (32)
      :  +- * BroadcastHashJoin Inner BuildLeft (31)
      :     :- BroadcastExchange (11)
      :     :  +- * Project (10)
      :     :     +- * BroadcastHashJoin Inner BuildRight (9)
      :     :        :- * Filter (3)
      :     :        :  +- * ColumnarToRow (2)
      :     :        :     +- Scan parquet default.customer (1)
      :     :        +- BroadcastExchange (8)
      :     :           +- * Project (7)
      :     :              +- * Filter (6)
      :     :                 +- * ColumnarToRow (5)
      :     :                    +- Scan parquet default.customer_address (4)
      :     +- * Filter (30)
      :        +- * HashAggregate (29)
      :           +- Exchange (28)
      :              +- * HashAggregate (27)
      :                 +- * Project (26)
      :                    +- * SortMergeJoin Inner (25)
      :                       :- * Sort (19)
      :                       :  +- Exchange (18)
      :                       :     +- * Project (17)
      :                       :        +- * BroadcastHashJoin Inner BuildRight (16)
      :                       :           :- * Filter (14)
      :                       :           :  +- * ColumnarToRow (13)
      :                       :           :     +- Scan parquet default.web_returns (12)
      :                       :           +- ReusedExchange (15)
      :                       +- * Sort (24)
      :                          +- Exchange (23)
      :                             +- * Filter (22)
      :                                +- * ColumnarToRow (21)
      :                                   +- Scan parquet default.customer_address (20)
      +- BroadcastExchange (52)
         +- * Filter (51)
            +- * HashAggregate (50)
               +- Exchange (49)
                  +- * HashAggregate (48)
                     +- * HashAggregate (47)
                        +- Exchange (46)
                           +- * HashAggregate (45)
                              +- * Project (44)
                                 +- * SortMergeJoin Inner (43)
                                    :- * Sort (40)
                                    :  +- Exchange (39)
                                    :     +- * Project (38)
                                    :        +- * BroadcastHashJoin Inner BuildRight (37)
                                    :           :- * Filter (35)
                                    :           :  +- * ColumnarToRow (34)
                                    :           :     +- Scan parquet default.web_returns (33)
                                    :           +- ReusedExchange (36)
                                    +- * Sort (42)
                                       +- ReusedExchange (41)


(1) Scan parquet default.customer
Output [14]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer]
PushedFilters: [IsNotNull(c_customer_sk), IsNotNull(c_current_addr_sk)]
ReadSchema: struct<c_customer_sk:int,c_customer_id:string,c_current_addr_sk:int,c_salutation:string,c_first_name:string,c_last_name:string,c_preferred_cust_flag:string,c_birth_day:int,c_birth_month:int,c_birth_year:int,c_birth_country:string,c_login:string,c_email_address:string,c_last_review_date:int>

(2) ColumnarToRow [codegen id : 2]
Input [14]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14]

(3) Filter [codegen id : 2]
Input [14]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14]
Condition : (isnotnull(c_customer_sk#1) AND isnotnull(c_current_addr_sk#3))

(4) Scan parquet default.customer_address
Output [2]: [ca_address_sk#15, ca_state#16]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_state), EqualTo(ca_state,GA), IsNotNull(ca_address_sk)]
ReadSchema: struct<ca_address_sk:int,ca_state:string>

(5) ColumnarToRow [codegen id : 1]
Input [2]: [ca_address_sk#15, ca_state#16]

(6) Filter [codegen id : 1]
Input [2]: [ca_address_sk#15, ca_state#16]
Condition : ((isnotnull(ca_state#16) AND (ca_state#16 = GA)) AND isnotnull(ca_address_sk#15))

(7) Project [codegen id : 1]
Output [1]: [ca_address_sk#15]
Input [2]: [ca_address_sk#15, ca_state#16]

(8) BroadcastExchange
Input [1]: [ca_address_sk#15]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#17]

(9) BroadcastHashJoin [codegen id : 2]
Left keys [1]: [c_current_addr_sk#3]
Right keys [1]: [ca_address_sk#15]
Join condition: None

(10) Project [codegen id : 2]
Output [13]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14]
Input [15]: [c_customer_sk#1, c_customer_id#2, c_current_addr_sk#3, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ca_address_sk#15]

(11) BroadcastExchange
Input [13]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#18]

(12) Scan parquet default.web_returns
Output [4]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#22), dynamicpruningexpression(wr_returned_date_sk#22 IN dynamicpruning#23)]
PushedFilters: [IsNotNull(wr_returning_addr_sk), IsNotNull(wr_returning_customer_sk)]
ReadSchema: struct<wr_returning_customer_sk:int,wr_returning_addr_sk:int,wr_return_amt:decimal(7,2)>

(13) ColumnarToRow [codegen id : 4]
Input [4]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22]

(14) Filter [codegen id : 4]
Input [4]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22]
Condition : (isnotnull(wr_returning_addr_sk#20) AND isnotnull(wr_returning_customer_sk#19))

(15) ReusedExchange [Reuses operator id: 60]
Output [1]: [d_date_sk#24]

(16) BroadcastHashJoin [codegen id : 4]
Left keys [1]: [wr_returned_date_sk#22]
Right keys [1]: [d_date_sk#24]
Join condition: None

(17) Project [codegen id : 4]
Output [3]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21]
Input [5]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22, d_date_sk#24]

(18) Exchange
Input [3]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21]
Arguments: hashpartitioning(wr_returning_addr_sk#20, 5), ENSURE_REQUIREMENTS, [id=#25]

(19) Sort [codegen id : 5]
Input [3]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21]
Arguments: [wr_returning_addr_sk#20 ASC NULLS FIRST], false, 0

(20) Scan parquet default.customer_address
Output [2]: [ca_address_sk#26, ca_state#27]
Batched: true
Location [not included in comparison]/{warehouse_dir}/customer_address]
PushedFilters: [IsNotNull(ca_address_sk), IsNotNull(ca_state)]
ReadSchema: struct<ca_address_sk:int,ca_state:string>

(21) ColumnarToRow [codegen id : 6]
Input [2]: [ca_address_sk#26, ca_state#27]

(22) Filter [codegen id : 6]
Input [2]: [ca_address_sk#26, ca_state#27]
Condition : (isnotnull(ca_address_sk#26) AND isnotnull(ca_state#27))

(23) Exchange
Input [2]: [ca_address_sk#26, ca_state#27]
Arguments: hashpartitioning(ca_address_sk#26, 5), ENSURE_REQUIREMENTS, [id=#28]

(24) Sort [codegen id : 7]
Input [2]: [ca_address_sk#26, ca_state#27]
Arguments: [ca_address_sk#26 ASC NULLS FIRST], false, 0

(25) SortMergeJoin [codegen id : 8]
Left keys [1]: [wr_returning_addr_sk#20]
Right keys [1]: [ca_address_sk#26]
Join condition: None

(26) Project [codegen id : 8]
Output [3]: [wr_returning_customer_sk#19, wr_return_amt#21, ca_state#27]
Input [5]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, ca_address_sk#26, ca_state#27]

(27) HashAggregate [codegen id : 8]
Input [3]: [wr_returning_customer_sk#19, wr_return_amt#21, ca_state#27]
Keys [2]: [wr_returning_customer_sk#19, ca_state#27]
Functions [1]: [partial_sum(UnscaledValue(wr_return_amt#21))]
Aggregate Attributes [1]: [sum#29]
Results [3]: [wr_returning_customer_sk#19, ca_state#27, sum#30]

(28) Exchange
Input [3]: [wr_returning_customer_sk#19, ca_state#27, sum#30]
Arguments: hashpartitioning(wr_returning_customer_sk#19, ca_state#27, 5), ENSURE_REQUIREMENTS, [id=#31]

(29) HashAggregate
Input [3]: [wr_returning_customer_sk#19, ca_state#27, sum#30]
Keys [2]: [wr_returning_customer_sk#19, ca_state#27]
Functions [1]: [sum(UnscaledValue(wr_return_amt#21))]
Aggregate Attributes [1]: [sum(UnscaledValue(wr_return_amt#21))#32]
Results [3]: [wr_returning_customer_sk#19 AS ctr_customer_sk#33, ca_state#27 AS ctr_state#34, MakeDecimal(sum(UnscaledValue(wr_return_amt#21))#32,17,2) AS ctr_total_return#35]

(30) Filter
Input [3]: [ctr_customer_sk#33, ctr_state#34, ctr_total_return#35]
Condition : isnotnull(ctr_total_return#35)

(31) BroadcastHashJoin [codegen id : 17]
Left keys [1]: [c_customer_sk#1]
Right keys [1]: [ctr_customer_sk#33]
Join condition: None

(32) Project [codegen id : 17]
Output [14]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ctr_state#34, ctr_total_return#35]
Input [16]: [c_customer_sk#1, c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ctr_customer_sk#33, ctr_state#34, ctr_total_return#35]

(33) Scan parquet default.web_returns
Output [4]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22]
Batched: true
Location: InMemoryFileIndex []
PartitionFilters: [isnotnull(wr_returned_date_sk#22), dynamicpruningexpression(wr_returned_date_sk#22 IN dynamicpruning#23)]
PushedFilters: [IsNotNull(wr_returning_addr_sk)]
ReadSchema: struct<wr_returning_customer_sk:int,wr_returning_addr_sk:int,wr_return_amt:decimal(7,2)>

(34) ColumnarToRow [codegen id : 10]
Input [4]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22]

(35) Filter [codegen id : 10]
Input [4]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22]
Condition : isnotnull(wr_returning_addr_sk#20)

(36) ReusedExchange [Reuses operator id: 60]
Output [1]: [d_date_sk#24]

(37) BroadcastHashJoin [codegen id : 10]
Left keys [1]: [wr_returned_date_sk#22]
Right keys [1]: [d_date_sk#24]
Join condition: None

(38) Project [codegen id : 10]
Output [3]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21]
Input [5]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, wr_returned_date_sk#22, d_date_sk#24]

(39) Exchange
Input [3]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21]
Arguments: hashpartitioning(wr_returning_addr_sk#20, 5), ENSURE_REQUIREMENTS, [id=#36]

(40) Sort [codegen id : 11]
Input [3]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21]
Arguments: [wr_returning_addr_sk#20 ASC NULLS FIRST], false, 0

(41) ReusedExchange [Reuses operator id: 23]
Output [2]: [ca_address_sk#26, ca_state#27]

(42) Sort [codegen id : 13]
Input [2]: [ca_address_sk#26, ca_state#27]
Arguments: [ca_address_sk#26 ASC NULLS FIRST], false, 0

(43) SortMergeJoin [codegen id : 14]
Left keys [1]: [wr_returning_addr_sk#20]
Right keys [1]: [ca_address_sk#26]
Join condition: None

(44) Project [codegen id : 14]
Output [3]: [wr_returning_customer_sk#19, wr_return_amt#21, ca_state#27]
Input [5]: [wr_returning_customer_sk#19, wr_returning_addr_sk#20, wr_return_amt#21, ca_address_sk#26, ca_state#27]

(45) HashAggregate [codegen id : 14]
Input [3]: [wr_returning_customer_sk#19, wr_return_amt#21, ca_state#27]
Keys [2]: [wr_returning_customer_sk#19, ca_state#27]
Functions [1]: [partial_sum(UnscaledValue(wr_return_amt#21))]
Aggregate Attributes [1]: [sum#37]
Results [3]: [wr_returning_customer_sk#19, ca_state#27, sum#38]

(46) Exchange
Input [3]: [wr_returning_customer_sk#19, ca_state#27, sum#38]
Arguments: hashpartitioning(wr_returning_customer_sk#19, ca_state#27, 5), ENSURE_REQUIREMENTS, [id=#39]

(47) HashAggregate [codegen id : 15]
Input [3]: [wr_returning_customer_sk#19, ca_state#27, sum#38]
Keys [2]: [wr_returning_customer_sk#19, ca_state#27]
Functions [1]: [sum(UnscaledValue(wr_return_amt#21))]
Aggregate Attributes [1]: [sum(UnscaledValue(wr_return_amt#21))#32]
Results [2]: [ca_state#27 AS ctr_state#34, MakeDecimal(sum(UnscaledValue(wr_return_amt#21))#32,17,2) AS ctr_total_return#35]

(48) HashAggregate [codegen id : 15]
Input [2]: [ctr_state#34, ctr_total_return#35]
Keys [1]: [ctr_state#34]
Functions [1]: [partial_avg(ctr_total_return#35)]
Aggregate Attributes [2]: [sum#40, count#41]
Results [3]: [ctr_state#34, sum#42, count#43]

(49) Exchange
Input [3]: [ctr_state#34, sum#42, count#43]
Arguments: hashpartitioning(ctr_state#34, 5), ENSURE_REQUIREMENTS, [id=#44]

(50) HashAggregate [codegen id : 16]
Input [3]: [ctr_state#34, sum#42, count#43]
Keys [1]: [ctr_state#34]
Functions [1]: [avg(ctr_total_return#35)]
Aggregate Attributes [1]: [avg(ctr_total_return#35)#45]
Results [2]: [CheckOverflow((promote_precision(avg(ctr_total_return#35)#45) * 1.200000), DecimalType(24,7), true) AS (avg(ctr_total_return) * 1.2)#46, ctr_state#34 AS ctr_state#34#47]

(51) Filter [codegen id : 16]
Input [2]: [(avg(ctr_total_return) * 1.2)#46, ctr_state#34#47]
Condition : isnotnull((avg(ctr_total_return) * 1.2)#46)

(52) BroadcastExchange
Input [2]: [(avg(ctr_total_return) * 1.2)#46, ctr_state#34#47]
Arguments: HashedRelationBroadcastMode(List(input[1, string, true]),false), [id=#48]

(53) BroadcastHashJoin [codegen id : 17]
Left keys [1]: [ctr_state#34]
Right keys [1]: [ctr_state#34#47]
Join condition: (cast(ctr_total_return#35 as decimal(24,7)) > (avg(ctr_total_return) * 1.2)#46)

(54) Project [codegen id : 17]
Output [13]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ctr_total_return#35]
Input [16]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ctr_state#34, ctr_total_return#35, (avg(ctr_total_return) * 1.2)#46, ctr_state#34#47]

(55) TakeOrderedAndProject
Input [13]: [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ctr_total_return#35]
Arguments: 100, [c_customer_id#2 ASC NULLS FIRST, c_salutation#4 ASC NULLS FIRST, c_first_name#5 ASC NULLS FIRST, c_last_name#6 ASC NULLS FIRST, c_preferred_cust_flag#7 ASC NULLS FIRST, c_birth_day#8 ASC NULLS FIRST, c_birth_month#9 ASC NULLS FIRST, c_birth_year#10 ASC NULLS FIRST, c_birth_country#11 ASC NULLS FIRST, c_login#12 ASC NULLS FIRST, c_email_address#13 ASC NULLS FIRST, c_last_review_date#14 ASC NULLS FIRST, ctr_total_return#35 ASC NULLS FIRST], [c_customer_id#2, c_salutation#4, c_first_name#5, c_last_name#6, c_preferred_cust_flag#7, c_birth_day#8, c_birth_month#9, c_birth_year#10, c_birth_country#11, c_login#12, c_email_address#13, c_last_review_date#14, ctr_total_return#35]

===== Subqueries =====

Subquery:1 Hosting operator id = 12 Hosting Expression = wr_returned_date_sk#22 IN dynamicpruning#23
BroadcastExchange (60)
+- * Project (59)
   +- * Filter (58)
      +- * ColumnarToRow (57)
         +- Scan parquet default.date_dim (56)


(56) Scan parquet default.date_dim
Output [2]: [d_date_sk#24, d_year#49]
Batched: true
Location [not included in comparison]/{warehouse_dir}/date_dim]
PushedFilters: [IsNotNull(d_year), EqualTo(d_year,2002), IsNotNull(d_date_sk)]
ReadSchema: struct<d_date_sk:int,d_year:int>

(57) ColumnarToRow [codegen id : 1]
Input [2]: [d_date_sk#24, d_year#49]

(58) Filter [codegen id : 1]
Input [2]: [d_date_sk#24, d_year#49]
Condition : ((isnotnull(d_year#49) AND (d_year#49 = 2002)) AND isnotnull(d_date_sk#24))

(59) Project [codegen id : 1]
Output [1]: [d_date_sk#24]
Input [2]: [d_date_sk#24, d_year#49]

(60) BroadcastExchange
Input [1]: [d_date_sk#24]
Arguments: HashedRelationBroadcastMode(List(cast(input[0, int, true] as bigint)),false), [id=#50]

Subquery:2 Hosting operator id = 33 Hosting Expression = wr_returned_date_sk#22 IN dynamicpruning#23


