Spark группа данных данных по уникальным значениям в столбце - PullRequest
0 голосов
/ 18 мая 2018

У меня есть следующий фрейм данных:

val df = Seq(
    ("A", 2.0),
    ("A", 1.5),
    ("B", 8.0),
    ("B", 9.0)
  ).toDF("id", "val")

Я хотел бы создать группу и для каждой группы на основе уникального идентификатора 1. иметь счетчик бегов, т.е. первый равен 0, второй равен 12. общее количество внутри группы.

должно выглядеть как

+---+---+---+---+
| id|val|order|count|
+---+---+---+---+
|  A|2.0|0 |2
|  A|1.5|1 |2
|  A|2.5|2 |2
|  B|8.0|0|2
|  B|9.0|1 |2
+---+---+

Я не вижу, как это сделать с помощью spark sql или функций.

1 Ответ

0 голосов
/ 18 мая 2018

Вот один из способов.

Входные данные:

+---+---+
|id |val|
+---+---+
|A  |2.0|
|A  |1.5|
|A  |4.5|
|A  |0.5|
|B  |8.0|
|B  |9.0|
+---+---+

Используйте функцию row_number для получения количества заказов.

val w1 = Window.partitionBy("id").orderBy(lit(null))

df.withColumn("rank", row_number().over(w1))
  .withColumn("order", 'rank - 1)
  .withColumn("count",count('order).over(w1))
  .drop('rank)
  .orderBy('id)
  .show(false)

Оба дают одинаковый результат:

+---+---+-----+-----+
|id |val|order|count|
+---+---+-----+-----+
|A  |2.0|0    |4    |
|A  |1.5|1    |4    |
|A  |4.5|2    |4    |
|A  |0.5|3    |4    |
|B  |8.0|0    |2    |
|B  |9.0|1    |2    |
+---+---+-----+-----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...