GitHub user davies opened a pull request:

    https://github.com/apache/spark/pull/11417

    [SPARK-13415] [SQL] Visualize subquery in SQL web UI

    ## What changes were proposed in this pull request?
    
    This PR support visualization for subquery in SQL web UI, also improve the 
explain of subquery, especially when it's used together with whole stage 
codegen.
    
    For example:
    ```python
    >>> sqlContext.range(100).registerTempTable("range")
    >>> sqlContext.sql("select id / (select sum(id) from range) from range 
where id > (select id from range limit 1)").explain(True)
    == Parsed Logical Plan ==
    'Project [unresolvedalias(('id / subquery#9), None)]
    :  +- 'SubqueryAlias subquery#9
    :     +- 'Project [unresolvedalias('sum('id), None)]
    :        +- 'UnresolvedRelation `range`, None
    +- 'Filter ('id > subquery#8)
       :  +- 'SubqueryAlias subquery#8
       :     +- 'GlobalLimit 1
       :        +- 'LocalLimit 1
       :           +- 'Project [unresolvedalias('id, None)]
       :              +- 'UnresolvedRelation `range`, None
       +- 'UnresolvedRelation `range`, None
    
    == Analyzed Logical Plan ==
    (id / scalarsubquery()): double
    Project [(cast(id#0L as double) / cast(subquery#9 as double)) AS (id / 
scalarsubquery())#11]
    :  +- SubqueryAlias subquery#9
    :     +- Aggregate [(sum(id#0L),mode=Complete,isDistinct=false) AS 
sum(id)#10L]
    :        +- SubqueryAlias range
    :           +- Range 0, 100, 1, 4, [id#0L]
    +- Filter (id#0L > subquery#8)
       :  +- SubqueryAlias subquery#8
       :     +- GlobalLimit 1
       :        +- LocalLimit 1
       :           +- Project [id#0L]
       :              +- SubqueryAlias range
       :                 +- Range 0, 100, 1, 4, [id#0L]
       +- SubqueryAlias range
          +- Range 0, 100, 1, 4, [id#0L]
    
    == Optimized Logical Plan ==
    Project [(cast(id#0L as double) / cast(subquery#9 as double)) AS (id / 
scalarsubquery())#11]
    :  +- SubqueryAlias subquery#9
    :     +- Aggregate [(sum(id#0L),mode=Complete,isDistinct=false) AS 
sum(id)#10L]
    :        +- Range 0, 100, 1, 4, [id#0L]
    +- Filter (id#0L > subquery#8)
       :  +- SubqueryAlias subquery#8
       :     +- GlobalLimit 1
       :        +- LocalLimit 1
       :           +- Project [id#0L]
       :              +- Range 0, 100, 1, 4, [id#0L]
       +- Range 0, 100, 1, 4, [id#0L]
    
    == Physical Plan ==
    WholeStageCodegen
    :  +- Project [(cast(id#0L as double) / cast(subquery#9 as double)) AS (id 
/ scalarsubquery())#11]
    :     :  +- Subquery subquery#9
    :     :     +- WholeStageCodegen
    :     :        :  +- TungstenAggregate(key=[], 
functions=[(sum(id#0L),mode=Final,isDistinct=false)], output=[sum(id)#10L])
    :     :        :     +- INPUT
    :     :        +- Exchange SinglePartition, None
    :     :           +- WholeStageCodegen
    :     :              :  +- TungstenAggregate(key=[], 
functions=[(sum(id#0L),mode=Partial,isDistinct=false)], output=[sum#14L])
    :     :              :     +- Range 0, 1, 4, 100, [id#0L]
    :     +- Filter (id#0L > subquery#8)
    :        :  +- Subquery subquery#8
    :        :     +- CollectLimit 1
    :        :        +- WholeStageCodegen
    :        :           :  +- Project [id#0L]
    :        :           :     +- Range 0, 1, 4, 100, [id#0L]
    :        +- Range 0, 1, 4, 100, [id#0L]
    ```
    
    The web UI looks like:
    
    
![subquery](https://cloud.githubusercontent.com/assets/40902/13377963/932bcbae-dda7-11e5-82f7-03c9be85d77c.png)
    
    This PR also change the tree structure of WholeStageCodegen to make it 
consistent than others. Before this change, Both WholeStageCodegen and 
InputAdapter hold a references to the same plans, those could be updated 
without notify another, causing problems, this is discovered by #11403 .
    
    ## How was this patch tested?
    
    Existing tests, also manual tests with the example query, check the explain 
and web UI.
    
    
    
    


You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/davies/spark viz_subquery

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/spark/pull/11417.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #11417
    
----
commit 24757f1fd0861507e3b773b171620e230ad96755
Author: Davies Liu <[email protected]>
Date:   2016-02-28T07:06:06Z

    Visualize subquery in SQL web UI

----


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

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

Reply via email to