Spark Scala: группировка по нескольким столбцам с логикой агрегирования - PullRequest
0 голосов
/ 21 января 2020

Учитывая следующий DataFrame:

+----+--------+--------+-----+------+------+------+
|name|platform|group_id|width|height|     x|     y|
+----+--------+--------+-----+-------------+------+
|   a|  plat_a|       0|500.0|1000.0|250.41|500.01|
|   a|  plat_a|       0|250.0| 500.0|125.75| 250.7|
|   a|  plat_a|       0|300.0| 800.0| 120.0| 111.7|
|   b|  plat_b|       0|500.0|1000.0| 250.5|500.67|
|   b|  plat_b|       1|400.0| 800.0|100.67|200.67|
|   b|  plat_b|       1|800.0|1600.0|201.07|401.07|
+----+--------+--------+-----+------+------+------+

Я хотел бы сгруппировать по имени, платформе, group_id и подсчитать по следующим столбцам logi c:

//normalizing value to percent with 2 digit precision
new_x = Math.round(x / width * 100.0) / 100.0
new_y = Math.round(y / height * 100.0) / 100.0

Так что Выходной DataFrame будет:

+----+--------+--------+------+------+-----+
|name|platform|group_id| new_x| new_y|count|
+----+--------+---------------+------+-----+
|   a|  plat_a|       0|   0.5|   0.5|    2|
|   a|  plat_a|       0|   0.4|  0.13|    1|
|   b|  plat_b|       0|   0.5|   0.5|    1|
|   b|  plat_b|       1|  0.25|  0.25|    2|
+----+--------+--------+------+------+-----+

Как мне решить эту проблему?

1 Ответ

3 голосов
/ 21 января 2020

Это должно быть довольно просто groupBy и count

import org.apache.spark.sql.functions._

df.withColumn("new_x", round($"x" / $"width" * 100.0 ) / 100.0)
  .withColumn("new_y", round($"y" / $"height" * 100.0 ) / 100.0)
  .groupBy("name", "platform", "group_id", "new_x", "new_y")
  .count()
  .show(false)

Вывод:

+----+--------+--------+-----+-----+-----+
|name|platform|group_id|new_x|new_y|count|
+----+--------+--------+-----+-----+-----+
|a   |plat_a  |0       |0.5  |0.5  |2    |
|b   |plat_b  |0       |0.5  |0.5  |1    |
|b   |plat_b  |1       |0.25 |0.25 |2    |
|a   |plat_a  |0       |0.4  |0.14 |1    |
+----+--------+--------+-----+-----+-----+
...