Я хочу использовать оконную функцию Spark SQL, но с пользовательским условием в спецификации фрейма.
Используемый кадр данных выглядит следующим образом:
+--------------------+--------------------+--------------------+-----+
| userid| elementid| prerequisites|score|
+--------------------+--------------------+--------------------+-----+
|a |1 |[] | 1 |
|a |2 |[] | 1 |
|a |3 |[] | 1 |
|b |1 |[] | 1 |
|a |4 |[1, 2] | 1 |
+--------------------+--------------------+--------------------+-----+
Каждый элемент в столбце prerequisites
является значением в столбце elementid
другой строки.
I хотел бы создать окно, где я делю на userid
, а затем захватить все предыдущие строки, где elementid
содержится в столбце prerequisites
данной строки.
Как только я достигну этого окна, я хочу выполните sum
для столбца score
.
Требуемый вывод для вышеприведенного примера:
+--------------------+--------------------+--------------------+-----+
| userid| elementid| prerequisites|sum |
+--------------------+--------------------+--------------------+-----+
|a |1 |[] | 0 |
|a |2 |[] | 0 |
|a |3 |[] | 0 |
|b |1 |[] | 0 |
|a |4 |[1, 2] | 2 |
+--------------------+--------------------+--------------------+-----+
Обратите внимание, что, поскольку пользователь a
является единственным пользователем с предварительными условиями его элемент, предшествующий этому, единственный с> 0 sum
.
Ближайший вопрос, который я видел, был этот вопрос, который использует collect_list.
Однако это не столько строит окно, сколько собирает потенциальный список идентификаторов. У кого-нибудь есть идеи, как сконструировать вышеупомянутое окно?