Насколько безопасно использовать WindowSpec с неопределенным фреймом в Spark? - PullRequest
0 голосов
/ 01 июня 2018

Я часто использую Window-функции в Apache Spark, например, для вычисления кумулятивных сумм.До сих пор я никогда не указывал кадр, так как вывод был правильным.Но недавно я прочитал в блоге (https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html):

В дополнение к упорядочению и разбиению, пользователям необходимо определить начальную границу фрейма, конечную границу фрейма итип фрейма, который является тремя компонентами спецификации фрейма.

Поэтому мне интересно, безопасно ли использовать неопределенный фрейм, например:

import org.apache.spark.sql.expressions.Window
val df = (1 to 10000).toDF("i")

df
.select(
  $"i",
  sum($"i").over(Window.orderBy($"i")).as("running_sum1"),//unspecified frame
  sum($"i").over(Window.orderBy($"i").rowsBetween(Window.unboundedPreceding, Window.currentRow)).as("running_sum2") // specified frame
)
.show()


+---+------------+------------+
|  i|running_sum1|running_sum2|
+---+------------+------------+
|  1|           1|           1|
|  2|           3|           3|
|  3|           6|           6|
|  4|          10|          10|
|  5|          15|          15|
|  6|          21|          21|
|  7|          28|          28|
|  8|          36|          36|
|  9|          45|          45|
| 10|          55|          55|
| 11|          66|          66|
| 12|          78|          78|
| 13|          91|          91|
| 14|         105|         105|
| 15|         120|         120|
| 16|         136|         136|
| 17|         153|         153|
| 18|         171|         171|
| 19|         190|         190|
| 20|         210|         210|
+---+------------+------------+

Видимо, онидать тот же вывод, но есть ли случаи, когда опасно использовать неопределенный кадр? Кстати, с помощью Spark 2.x.

1 Ответ

0 голосов
/ 01 июня 2018

Да, это безопасно.

Глядя на исходный код главной ветки для объекта Window на github , есть следующее примечание (его нет в ветке 2.3.0):

Когда порядок не определен, по умолчанию используется неограниченная оконная рама (rowFrame, unboundedPreceding, unboundedFollowing).Когда порядок определен, по умолчанию используется растущая оконная рама (rangeFrame, unboundedPreceding, currentRow).

Другими словами, когда в окне есть порядок, то есть с помощью orderBy,неопределенная граница на кадре равна:

rowsBetween(Window.unboundedPreceding, Window.currentRow)

В случае, если orderBy не используется, по умолчанию используется любое неограниченное окно:

rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)

Дальнейшие исследования показывают, что эти значения по умолчанию использовались, так как оконные функции были введены в Spark 1.4.0, относящихся к github branch :

def defaultWindowFrame(
    hasOrderSpecification: Boolean,
    acceptWindowFrame: Boolean): SpecifiedWindowFrame = {
  if (hasOrderSpecification && acceptWindowFrame) {
    // If order spec is defined and the window function supports user specified window frames,
    // the default frame is RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.
    SpecifiedWindowFrame(RangeFrame, UnboundedPreceding, CurrentRow)
  } else {
    // Otherwise, the default frame is
    // ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING.
    SpecifiedWindowFrame(RowFrame, UnboundedPreceding, UnboundedFollowing)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...