Spark groupby агрегации

Я пытаюсь сделать группу по агрегатам. Использование Spark 1.5.2

Подскажите, пожалуйста, почему это не работает.

in - это фрейм данных.

scala> in
res28: org.apache.spark.sql.DataFrame = [id: int, city: string]




scala> in.show
+---+--------+
| id|    city|
+---+--------+
| 10|Bathinda|
| 20|Amritsar|
| 30|Bathinda|
+---+--------+

scala>in.groupBy("city").agg(Map{
 |       "id" -> "sum"
 |     }).show(true)
+----+-------+
|city|sum(id)|
+----+-------+
+----+-------+

Спасибо,

Я ожидаю, что на выходе должны быть города и сумма идентификаторов

РЕДАКТИРОВАТЬ: я не знаю, почему это сработало в следующий раз, когда я создал новую искровую оболочку


person user2230605    schedule 26.11.2015    source источник
comment
sc.parallelize(Seq((10, "Bathinda"), (20, "Amritsar"), (30, "Bathinda"))).toDF("id", "city").groupBy("city").agg(Map("id" -> "sum")).show показывает такие же результаты?   -  person emeth    schedule 26.11.2015
comment
Я выполнил те же самые команды, но получил правильный результат. Попробуйте сделать это в одну строчку.   -  person Jeff L    schedule 26.11.2015


Ответы (1)


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

val in = sc.parallelize(Seq(
  (10, "Bathinda"), (20, "Amritsar"), (30, "Bathinda"))).toDF("id", "city")

Вы можете видеть, что эти строки кода дадут одинаковый результат

scala> in.groupBy("city").agg(Map("id" -> "sum")).show
+--------+-------+
|    city|sum(id)|
+--------+-------+
|Bathinda|     40|
|Amritsar|     20|
+--------+-------+

scala> in.groupBy("city").agg(Map{ "id" -> "sum"}).show
+--------+-------+
|    city|sum(id)|
+--------+-------+
|Bathinda|     40|
|Amritsar|     20|
+--------+-------+

scala> in.groupBy("city").agg(Map{ "id" -> "sum"}).show(true)
+--------+-------+
|    city|sum(id)|
+--------+-------+
|Bathinda|     40|
|Amritsar|     20|
+--------+-------+

scala> in.groupBy("city").agg(sum($"id")).show(true)
+--------+-------+
|    city|sum(id)|
+--------+-------+
|Bathinda|     40|
|Amritsar|     20|
+--------+-------+

scala> in.groupBy("city").agg(sum(in("id"))).show(true)
+--------+-------+
|    city|sum(id)|
+--------+-------+
|Bathinda|     40|
|Amritsar|     20|
+--------+-------+

Примечание. Аргумент show по умолчанию имеет значение false, и он касается только того, следует ли отображать все значение поля или нет. (Иногда поле слишком длинное, и вам просто нужен предварительный просмотр)

person eliasah    schedule 26.11.2015
comment
можно agg(sum($"id"), count($"id"), min($"id"), max($"id") )? - person KillerSnail; 24.11.2016
comment
Да, ты можешь это сделать. - person eliasah; 24.11.2016