Сводка столбца (достижение функции куба в наборе данных Spark)

Для приведенного ниже набора данных мне нужно получить сводные данные на основе выбранного столбца. Образец набора данных содержит следующие данные ниже.

+---------+----------+--------+---------+
| Column1 | Column2  | Expend | Expend2 |
+---------+----------+--------+---------+
| School1 | Student1 | 5      | 10      |
+---------+----------+--------+---------+
| School1 | Student2 | 11     | 12      |
+---------+----------+--------+---------+
| School2 | Student1 | 6      | 8       |
+---------+----------+--------+---------+
| School2 | Student2 | 7      | 8       |
+---------+----------+--------+---------+

Мне нужно получить сводные данные для столбца 2, как показано ниже,

Обязательный формат

+---------+----------+--------+---------+
| Column1 | Column2  | Expend | Expend2 |
+---------+----------+--------+---------+
| School1 | Total    | 16     | 22      |
+---------+----------+--------+---------+
| School1 | Student1 | 5      | 10      |
+---------+----------+--------+---------+
| School1 | Student2 | 11     | 12      |
+---------+----------+--------+---------+
| School2 | Total    | 13     | 16      |
+---------+----------+--------+---------+
| School2 | Student1 | 6      | 8       |
+---------+----------+--------+---------+
| School2 | Student2 | 7      | 8       |
+---------+----------+--------+---------+

Я пытался использовать функцию куба в наборе данных, но это не дало ожидаемых результатов. Я получаю значения null вместо Total, что тоже нормально, но данные, которые я не получаю в указанном выше формате.

Я хотел попробовать использовать dataset.cube("Column2").agg(sum("Expend1"),sum("Expend2"));

Но эта приведенная выше строка кода дает мне только данные для Column2. Как я могу получить значения Column1 с указанными выше возвращаемыми данными.


person Garry Steve    schedule 03.03.2018    source источник
comment
Что ты пробовал, Гэри? ответ кажется простым: группируйте агрегацию и находите итоги для каждой группы, сохраняйте их в новом фрейме данных и объединяйте старый с новым фреймом данных. Вы должны быть сделаны   -  person Ramesh Maharjan    schedule 03.03.2018
comment
@RameshMaharjan Я попробовал dataset.cube(Column2), так как мне нужна только сводка по столбцу 2, но он стирает столбец 1, мне тоже нужен столбец 1   -  person Garry Steve    schedule 03.03.2018
comment
Не могли бы вы дать образец заголовка для вышеуказанного формата, для вышеуказанного набора данных   -  person Garry Steve    schedule 03.03.2018
comment
вы используете java правильно? Я немного слаб в java spark. :(   -  person Ramesh Maharjan    schedule 03.03.2018
comment
Вы можете попробовать в искре, я могу переписать то же самое на Java.   -  person Garry Steve    schedule 03.03.2018
comment
Я могу писать на скале. :)   -  person Ramesh Maharjan    schedule 03.03.2018


Ответы (1)


Из существующего dataframe вы можете создать полный фрейм данных, где вы groupBy столбец1 и суммируете все столбцы расходов как

import org.apache.spark.sql.functions._
val totaldf = df.groupBy("Column1").agg(lit("Total").as("Column2"), sum("Expend").as("Expend"), sum("Expend2").as("Expend2"))

Тогда вы просто merge их

df.union(totaldf).orderBy(col("Column1"), col("Column2").desc).show(false)

Вы должны получить желаемый результат

+-------+--------+------+-------+
|Column1|Column2 |Expend|Expend2|
+-------+--------+------+-------+
|School1|Total   |16.0  |22.0   |
|School1|Student2|11    |12     |
|School1|Student1|5     |10     |
|School2|Total   |13.0  |16.0   |
|School2|Student2|7     |8      |
|School2|Student1|6     |8      |
+-------+--------+------+-------+
person Ramesh Maharjan    schedule 03.03.2018
comment
Спасибо Рамеш, как я могу получить итоги наверху. - person Garry Steve; 03.03.2018
comment
вы можете заказать column2 в описании :) ответ обновлен;) - person Ramesh Maharjan; 03.03.2018
comment
@GarrySteve, это не этот вопрос и продолжение этого. да, тогда не могли бы вы принять этот ответ? - person Ramesh Maharjan; 05.03.2018