2017-02-21 26 views
3

У меня есть dataframe с столбцом по имени c1, c2, c3, c4. Я хочу, чтобы сгруппировать его на колонке и использовать функцию AGG на другой колонке, например, мин/макс/AGG .. и т.д., и получить соответствующее другое значение столбца, основываясь на результате функции AGGDataframe groupBy, получить значение соответствующих строк, основанное на результате агрегатной функции

Пример:

c1 c2 c3 c4 
1 23 1 1 
1 45 2 2 
1 91 3 3 
1 90 4 4 
1 71 5 5 
1 42 6 6 
1 72 7 7 
1 44 8 8 
1 55 9 9 
1 21 0 0 

Если результат:

c1 c2 c3 c4 
1 91 3 3 

пусть dataframe быть ДФ

df.groupBy($"c1").agg(max($"c2"), ??, ??) 

может кто-то пожалуйста, Хель p что должно пойти на место?

Я знаю решение этой проблемы с помощью RDD. Требуется, чтобы исследовать, может ли это быть решить в более простой способ использования Dataframe/Dataset апи

+0

Я нашел этот ответ полезным. Он предлагает делать именно то, что вы хотите. : https://stackoverflow.com/questions/41236804/spark-dataframes-reducing-by-key – user238607

ответ

2

Вы можете сделать это в два этапа:

  • расчета агрегированного кадра данных;

  • присоединиться к кадру данных с исходным фреймом данных и фильтром на основе условия;

так:

val maxDF = df.groupBy("c1").agg(max($"c2").as("maxc2")) 
// maxDF: org.apache.spark.sql.DataFrame = [c1: int, maxc2: int] 

df.join(maxDF, Seq("c1")).where($"c2" === $"maxc2").drop($"maxc2").show 
+---+---+---+---+ 
| c1| c2| c3| c4| 
+---+---+---+---+ 
| 1| 91| 3| 3| 
+---+---+---+---+ 
+0

_Thanks много @Psidom_ –

+0

Что вы думаете о решении, упомянутом в ответе здесь: https://stackoverflow.com/ вопросы/41236804/искровой dataframes-восстановительно-на-ключ – user238607