Функция куба / свертки фрейма данных, но для того, чтобы пропустить суммирование столбца для нескольких записей в spark

#apache-spark #apache-spark-sql

#apache-spark #apache-spark-sql

Вопрос:

У меня есть следующий фрейм данных:

  -------- ------ --------- --------- 
|  Col1  | col2 | values1 | Values2 |
 -------- ------ --------- --------- 
| item1  | A1   |       5 |      11 |
| item1  | A2   |       5 |      25 |
| item1  | A3   |       5 |      33 |
| item1  | na   |         |      18 |
| item2  | A1   |       6 |      12 |
| item2  | A2   |       6 |      26 |
| item2  | A3   |       6 |      34 |
| item2  | na   |       6 |         |
 -------- ------ --------- --------- 
  

который может быть создан с помощью этого кода

 df = Seq(
        (item1, A1,5 ,11),
        (item1, A2,5 ,25),
        (item1, A3,5 ,33),
        (item1, na,0,18),
        (item2, A1,6 ,12),
        (item2, A2,6 ,26),
        (item2, A3,6 ,34),
        (item2, na,6 ,0)).toDF('Col1', 'col2', 'values1', 'Values2');
  

Я хочу пропустить добавление значений столбца 1 для всех записей при выполнении свертки или куба для него.

Мой желаемый результат:

  ------- ------ --------- --------- 
| Col1  | col2 | values1 | values2 |
 ------- ------ --------- --------- 
| null  | null |      17 |     159 |
| item1 | null |       5 |      87 |
| item1 | A1   |       5 |      11 |
| item1 | A2   |       5 |      25 |
| item1 | A3   |       5 |      33 |
| item1 | na   |       0 |      18 |
| item2 | null |      12 |      72 |
| item2 | A1   |       6 |      12 |
| item2 | A2   |       6 |      26 |
| item2 | A3   |       6 |      34 |
| item2 | na   |       6 |         |
 ------- ------ --------- --------- 
  

Как я могу применить к этому набору данных функцию свертки или куба, чтобы сумма значений от 1 до Col1 суммировала значения для любого (A1 / A2 / A3) na =
так, например:

вторая строка показывает

=5= 5 0 значений 1 и значений 2= 87=11 25 33 18 и 6-я строка values1 =12= 6 6 и values2 =12 26 34 0=72

Но то, что я получаю сейчас, выполняя операцию свертки, суммирует все agg, чего я не хочу для столбца values1.

 df.rollup("Col1","col2").agg(sum("values1") as "values1",sum("values2") as "values2");
  

Текущий вывод:

  ------- ------ --------- --------- 
| Col1  | col2 | values1 | values2 |
 ------- ------ --------- --------- 
| null  | null |      39 |     159 |
| item1 | null |      15 |      87 |
| item1 | A1   |       5 |      11 |
| item1 | A2   |       5 |      25 |
| item1 | A3   |       5 |      33 |
| item1 | na   |       0 |      18 |
| item2 | null |      24 |      72 |
| item2 | A1   |       6 |      12 |
| item2 | A2   |       6 |      26 |
| item2 | A3   |       6 |      34 |
| item2 | na   |       6 |         |
 ------- ------ --------- --------- 
  

(Ссылка, которая была опубликована как dup, не является фактическим запросом здесь. Желаемый результат отличается от ответов по ссылке)

Комментарии:

1. Я бы попробовал решения. Пожалуйста, не удаляйте и не перепечатывайте снова, а отредактируйте тот же вопрос. PS: Дублирующие флаги не являются наказанием.

2. Нет Элиаса. Этот вопрос был полностью перетасован. Мне следовало бы отредактировать заново. Да.

3. Если вы считаете, что ссылки не помогают, вы можете прокомментировать, и мы посмотрим, как мы могли бы помочь, или, возможно, я снова открою вопрос.

4. @eliasah. Конечно. Рассмотрим все это в дальнейшем. Спасибо, что подняли этот вопрос.

5. @eliasah Ссылки, которые вы пометили как дубликаты, определенно отличаются от того, что я просил в качестве желаемого результата. Не могли бы вы, пожалуйста, взглянуть на желаемый результат один раз, и ссылка ответит.