как группировать только по определенным функциям с помощью pyspark

#python #apache-spark #pyspark #group-by #apache-spark-sql

#python #apache-spark #pyspark #группировать по #apache-spark-sql

Вопрос:

У меня есть этот фрейм данных

  --------- ------ ----- ------------- ----- 
|    LCLid|KWH/hh|Acorn|Acorn_grouped|Month|
 --------- ------ ----- ------------- ----- 
|MAC000002|   0.0|    0|            0|   10|
|MAC000002|   0.0|    0|            0|   10|
|MAC000002|   0.0|    0|            0|   10|
 

Я хочу группировать по LCid и среднему потреблению за месяц только определенным образом, чтобы получить

  --------- ----- ------------------ ---------- ------------------ 
|    LCLid|Month|       sum(KWH/hh)|Acorn     |Acorn_grouped     |
 --------- ----- ------------------ ---------- ------------------ 
|MAC000003|   10| 904.9270009999999|      0   |              0   | 
|MAC000022|    2|1672.5559999999978|      1   |              0   |
|MAC000019|    4| 368.4720001000007|      1   |              1   |
|MAC000022|    9|449.07699989999975|      0   |              1   |
|MAC000024|    8| 481.7160003000004|      1   |              0   |
 

но то, что я мог бы сделать, это использовать этот код

 dataset=dataset.groupBy("LCLid","Month").sum()
 

что дало мне этот результат

  --------- ----- ------------------ ---------- ------------------ ---------- 
|    LCLid|Month|       sum(KWH/hh)|sum(Acorn)|sum(Acorn_grouped)|sum(Month)|
 --------- ----- ------------------ ---------- ------------------ ---------- 
|MAC000003|   10| 904.9270009999999|      2978|              2978|     29780|
|MAC000022|    2|1672.5559999999978|     12090|              4030|      8060|
|MAC000019|    4| 368.4720001000007|     20174|              2882|     11528|
|MAC000022|    9|449.07699989999975|      8646|              2882|     25938|
 

проблема в том, что функция суммы была рассчитана также для acron и acron_grouped
есть ли у вас какие-либо идеи, как я мог бы сделать группировку только для KWH / hh

Ответ №1:

Зависит от того, как вы хотите обрабатывать два других столбца. Если вы не хотите их суммировать, а просто хотите получить любое значение из этого столбца, вы можете сделать

 import pyspark.sql.functions as F

dataset = dataset.groupBy("LCLid","Month").agg(
    F.sum("KWH/hh"),
    F.first("Acorn").alias("Acorn"),
    F.first("Acorn_grouped").alias("Acorn_grouped")
)
 

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

1. остальные столбцы должны оставаться неизменными, поскольку для каждого LCLid есть фиксированный номер acron и Acorn_grouped

2. @eyabaklouti тогда вы также можете попробовать dataset = dataset.groupBy("LCLid","Month","Acorn","Acorn_grouped").agg(F.sum("KWH/hh"))