Как создать столбец идентификатора строки в Spark dataframe для каждого отдельного значения столбца с помощью Scala

61
4

У меня есть кадр данных в scala spark, поскольку

категория | оценка |

A | 0.2

A | 0,3

A | 0,3

B | 0.9

B | 0.8

B | 1

Я хотел бы добавить столбец столбца строки как

категория | оценка | строка-идентификатор

A | 0,2 | 0

A | 0,3 | 1

A | 0,3 | 2

B | 0,9 | 0

B | 0,8 | 1

B | 1 | 2

В принципе, я хочу, чтобы идентификатор строки монотонно увеличивался для каждого отдельного значения в категории столбцов. У меня уже есть отсортированный dataframe, поэтому все строки с одинаковой категорией группируются вместе. Тем не менее, я до сих пор не знаю, как создать row_id, который перезагружается при появлении новой категории. Пожалуйста помоги!

спросил(а) 2018-09-19T20:34:00+03:00 2 года, 6 месяцев назад
1
Решение
115

Это хороший прецедент для функций агрегации Window

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.row_number
import df.sparkSession.implicits._

val window = Window.partitionBy('category).orderBy('score)
df.withColumn("row-id", row_number.over(window))

Функции окна работают как groupBy за исключением того, что вместо каждой группы, возвращающей одно значение, каждая строка в каждой группе возвращает одно значение. В этом случае значение представляет собой позицию строки в группе строк одной и той же категории. Кроме того, если это тот эффект, который вы пытаетесь достичь, вам не нужно предварительно предварительно отсортировать category столбца.

ответил(а) 2018-09-19T20:39:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема