Spark Window задаются с использованием трех частей: раздела, порядка и рамки.
- Если ни одна из частей не указана, то весь набор данных будет рассматриваться как одно окно.
- Когда разделение указывается с использованием столбца, одно окно на отдельное значение столбца имеет видсоздано.Если указан только раздел, то при оценке строки для всех учитываются все строки в этом разделе.Вот почему вы видите все 4 значения [10, 15, 10, 25] для всех строк в разделе x.
- Если задано разделение и упорядочение, то при оценке функции строки она принимает порядок ранга строкв раздел и все строки, которые имеют одинаковое или более низкое значение (если задан порядок asc по умолчанию), включены в рангВ вашем случае первая строка включает в себя [10,10], потому что в разделе 2 строки с одинаковым рангом.
- Если указаны спецификации Frame rowBetween и rangeBetween, то при оценке строки будут выбраны только те строки, которые соответствуют кадруправить.например, unbounded и currentRow указан, он выберет текущую строку и все строки, которые появляются перед ней.Если указан параметр orderBy, он изменит соответствующие строки перед текущей строкой.
специально для вашего вопроса, orderBy предназначен не только для сортировки разделенных данных, но и для изменения выбора кадра строки
Ниже приведены различные спецификации окон и соответствующие выходные данные
Window.orderBy()
+---+-----+----------------------------+
|key|price|price_list |
+---+-----+----------------------------+
|x |15 |[15, 10, 10, 20, 10, 25, 20]|
|x |10 |[15, 10, 10, 20, 10, 25, 20]|
|y |10 |[15, 10, 10, 20, 10, 25, 20]|
|y |20 |[15, 10, 10, 20, 10, 25, 20]|
|x |10 |[15, 10, 10, 20, 10, 25, 20]|
|x |25 |[15, 10, 10, 20, 10, 25, 20]|
|y |20 |[15, 10, 10, 20, 10, 25, 20]|
+---+-----+----------------------------+
Window.partitionBy('key')
+---+-----+----------------+
|key|price| price_list|
+---+-----+----------------+
| x| 15|[15, 10, 10, 25]|
| x| 10|[15, 10, 10, 25]|
| x| 10|[15, 10, 10, 25]|
| x| 25|[15, 10, 10, 25]|
| y| 20| [20, 10, 20]|
| y| 10| [20, 10, 20]|
| y| 20| [20, 10, 20]|
+---+-----+----------------+
Window.partitionBy('key').orderBy('price')
+---+-----+----------------+
|key|price| ordered_list|
+---+-----+----------------+
| x| 10| [10, 10]|
| x| 10| [10, 10]|
| x| 15| [10, 10, 15]|
| x| 25|[10, 10, 15, 25]|
| y| 10| [10]|
| y| 20| [10, 20, 20]|
| y| 20| [10, 20, 20]|
+---+-----+----------------+
w = Window.partitionBy('key').orderBy(F.desc('price'))
+---+-----+----------------+
|key|price| ordered_list|
+---+-----+----------------+
| x| 25| [25]|
| x| 15| [25, 15]|
| x| 10|[25, 15, 10, 10]|
| x| 10|[25, 15, 10, 10]|
| y| 20| [20, 20]|
| y| 20| [20, 20]|
| y| 10| [20, 20, 10]|
+---+-----+----------------+
Window.partitionBy('key').orderBy('price').rowsBetween(Window.unboundedPreceding, Window.currentRow)
+---+-----+----------------+
|key|price| ordered_list|
+---+-----+----------------+
| x| 10| [10]|
| x| 10| [10, 10]|
| x| 15| [10, 10, 15]|
| x| 25|[10, 10, 15, 25]|
| y| 10| [10]|
| y| 20| [10, 20]|
| y| 20| [10, 20, 20]|
+---+-----+----------------+
Window.partitionBy('key').rowsBetween(Window.unboundedPreceding, Window.currentRow)
+---+-----+----------------+
|key|price| ordered_list|
+---+-----+----------------+
| x| 15| [15]|
| x| 10| [15, 10]|
| x| 10| [15, 10, 10]|
| x| 25|[15, 10, 10, 25]|
| y| 10| [10]|
| y| 20| [10, 20]|
| y| 20| [10, 20, 20]|
+---+-----+----------------+