Вычислить значение столбца Spark в зависимости от значения другой строки в том же столбце - PullRequest
1 голос
/ 29 мая 2020

Я работаю над Apache spark 2.3.0 cloudera4, и у меня проблема с обработкой Dataframe.

У меня есть этот входной фрейм данных:

+---+---+----+
| id| d1| d2 |
+---+---+----+
|  1|   | 2.0|
|  2|   |-4.0|
|  3|   | 6.0|
|  4|3.0|    |
+---+---+----+

И я нужен этот вывод:

+---+---+----+----+
| id| d1| d2 |  r |
+---+---+----+----+
|  1|   | 2.0| 7.0|
|  2|   |-4.0| 5.0|
|  3|   | 6.0| 9.0|
|  4|3.0|    | 3.0|
+---+---+.---+----+

То есть, с точки зрения итерации, получить самую большую строку идентификатора (4) и поместить значение d1 в столбец r, затем взять следующую строку (3) и положить r [4] + d2 [3] в столбце r и т. Д.

Возможно ли сделать что-то подобное в Spark? потому что мне понадобится вычисленное значение из строки, чтобы вычислить значение для другой строки.

1 Ответ

1 голос
/ 29 мая 2020

Как насчет этого? Важным битом является sum($"r1").over(Window.orderBy($"id".desc), который вычисляет совокупную сумму столбца. Помимо этого, я создаю пару вспомогательных столбцов, чтобы получить максимальный идентификатор и правильно упорядочить.

val result = df
  .withColumn("max_id", max($"id").over(Window.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)))
  .withColumn("r1", when($"id" === $"max_id", $"d1").otherwise($"d2"))
  .withColumn("r", sum($"r1").over(Window.orderBy($"id".desc)))
  .drop($"max_id").drop($"r1")
  .orderBy($"id")
result.show


+---+----+----+---+
| id|  d1|  d2|  r|
+---+----+----+---+
|  1|null| 2.0|7.0|
|  2|null|-4.0|5.0|
|  3|null| 6.0|9.0|
|  4| 3.0|null|3.0|
+---+----+----+---+
...