[ 
https://issues.apache.org/jira/browse/SPARK-7322?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Reynold Xin updated SPARK-7322:
-------------------------------
    Description: 
Here's a proposal for supporting window functions in the DataFrame DSL:

1. Add an over function to Column:
{code}
class Column {
  ...
  def over(window: Window): Column
  ...
}
{code}

2. Window:
{code}
object Window {
  def partitionBy(...): Window
  def orderBy(...): Window

  object Frame {
    def unbounded: Frame
    def preceding(n: Long): Frame
    def following(n: Long): Frame
  }

  class Frame
}

class Window {
  def orderBy(...): Window
  def rowsBetween(Frame, Frame): Window
  def rangeBetween(Frame, Frame): Window  // maybe add this later
}
{code}

Here's an example to use it:
{code}
df.select(
  avg(“age”).over(Window.partitionBy(“..”, “..”).orderBy(“..”, “..”)
    .rowsBetween(Frame.unbounded, Frame.currentRow))
)

df.select(
  avg(“age”).over(Window.partitionBy(“..”, “..”).orderBy(“..”, “..”)
    .rowsBetween(Frame.preceding(50), Frame.following(10)))
)
{code}

  was:
Here's a proposal for supporting window functions in the DataFrame DSL:

1. Add an over function to Column:
{code}
class Column {
  ...
  def over(): WindowFunctionSpec
  ...
}
{code}

2. WindowFunctionSpec:
{code}
// By default frame = full partition
class WindowFunctionSpec {
  def partitionBy(cols: Column*): WindowFunctionSpec
  def orderBy(cols: Column*): WindowFunctionSpec

  // restrict frame beginning from current row - n position
  def rowsPreceding(n: Int): WindowFunctionSpec

  // restrict frame ending from current row - n position
  def rowsFollowing(n: Int): WindowFunctionSpec

  def rangePreceding(n: Int): WindowFunctionSpec
  def rowsFollowing(n: Int): WindowFunctionSpec
}
{code}

Here's an example to use it:
{code}
df.select(
  df.store,
  df.date,
  df.sales,
  avg(df.sales).over.partitionBy(df.store)
                    .orderBy(df.store) 
                    .rowsFollowing(0)    // this means from unbounded preceding 
to current row
)
{code}


> Add DataFrame DSL for window function support
> ---------------------------------------------
>
>                 Key: SPARK-7322
>                 URL: https://issues.apache.org/jira/browse/SPARK-7322
>             Project: Spark
>          Issue Type: Sub-task
>          Components: SQL
>            Reporter: Reynold Xin
>            Assignee: Cheng Hao
>              Labels: DataFrame
>
> Here's a proposal for supporting window functions in the DataFrame DSL:
> 1. Add an over function to Column:
> {code}
> class Column {
>   ...
>   def over(window: Window): Column
>   ...
> }
> {code}
> 2. Window:
> {code}
> object Window {
>   def partitionBy(...): Window
>   def orderBy(...): Window
>   object Frame {
>     def unbounded: Frame
>     def preceding(n: Long): Frame
>     def following(n: Long): Frame
>   }
>   class Frame
> }
> class Window {
>   def orderBy(...): Window
>   def rowsBetween(Frame, Frame): Window
>   def rangeBetween(Frame, Frame): Window  // maybe add this later
> }
> {code}
> Here's an example to use it:
> {code}
> df.select(
>   avg(“age”).over(Window.partitionBy(“..”, “..”).orderBy(“..”, “..”)
>     .rowsBetween(Frame.unbounded, Frame.currentRow))
> )
> df.select(
>   avg(“age”).over(Window.partitionBy(“..”, “..”).orderBy(“..”, “..”)
>     .rowsBetween(Frame.preceding(50), Frame.following(10)))
> )
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

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

Reply via email to