как переименовать Столбцы, произведенные функцией count () в Scala - PullRequest
1 голос
/ 25 февраля 2020

У меня есть следующее df:

+------+-------+--------+
|student|  vars|observed|
+------+-------+--------+
|  1|   ABC   |      19|
|  1|    ABC   |       1|
|  2|    CDB   |       1|
|  1|    ABC   |       8|
|   3|   XYZ   |       3|
|  1|    ABC   |     389|
|   2|   CDB   |     946|
|  1|    ABC   |     342|
|+------+-------+--------+

Я хотел добавить новый столбец частоты groupBy два столбца "student", "vars" в SCALA.

val frequency = df.groupBy($"student", $"vars").count()

Этот код генерирует столбец "count" с частотами НО теряет наблюдаемый столбец из df .

Я хотел бы создать новый df следующим образом без потери «наблюдаемой» колонки

+------+-------+--------+------------+
|student|  vars|observed|total_count |
+------+-------+--------+------------+
|  1|   ABC   |        9|22
|  1|    ABC   |       1|22
|  2|    CDB   |       1|7
|  1|    ABC   |       2|22
|   3|   XYZ   |       3|3
|  1|    ABC   |       8|22
|   2|   CDB   |       6|7
|  1|    ABC   |       2|22
|+------+-------+-------+--------------+

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Мы также можем использовать оконные функции

val windowSpec = Window.partitionBy("student","vars")
val frequency  = df.withColumn("total_count", count(col("student")) over windowSpec)
      .show


+-------+----+--------+-----------+
|student|vars|observed|total_count|
+-------+----+--------+-----------+
|3      |XYZ |3       |1          |
|2      |CDB |1       |2          |
|2      |CDB |946     |2          |
|1      |ABC |389     |5          |
|1      |ABC |342     |5          |
|1      |ABC |19      |5          |
|1      |ABC |1       |5          |
|1      |ABC |8       |5          |
+-------+----+--------+-----------+
1 голос
/ 25 февраля 2020

Вы не можете сделать это напрямую, но есть несколько способов,

  1. Вы можете присоединиться к оригинальному df с количеством df. отметьте здесь
  2. Вы собираете столбец observed при агрегации и explode снова

С explode:

 val frequency = df.groupBy("student", "vars").agg(collect_list("observed").as("observed_list"),count("*").as("total_count")).select($"student", $"vars",explode($"observed_list").alias("observed"), $"total_count")

scala> frequency.show(false)
+-------+----+--------+-----------+
|student|vars|observed|total_count|
+-------+----+--------+-----------+
|3      |XYZ |3       |1          |
|2      |CDB |1       |2          |
|2      |CDB |946     |2          |
|1      |ABC |389     |5          |
|1      |ABC |342     |5          |
|1      |ABC |19      |5          |
|1      |ABC |1       |5          |
|1      |ABC |8       |5          |
+-------+----+--------+-----------+
...