Получаем сумму каждого столбца в pyspark dataframe

#dataframe #pyspark #pyspark-sql #union-all

#dataframe #pyspark #apache-spark-sql #объединение-все

Вопрос:

У меня есть dataframe, который состоит из 3 строк и более 20 столбцов (даты)

  ---- ----- -----          
|Cat |01/02|02/02|......
 ---- ----- ----- 
| a  | 20  |   7 |......
| b  | 30  |  12 |......
 ---- --- ------- 
  

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

  ---- ----- ----- 
|Cat |01/02|02/02|......
 ---- ----- ----- 
| a  | 20  |   7 |......
| b  | 30  |  12 |......
| All| 50  |  19 |......
 ---- --- ------- 
  

Я кодирую в PySpark, и сценарий следующий:

 from pyspark.sql import functions as F
    for col_name in fs.columns:
      print(col_name)

      sf = df.unionAll(
      df.select([
         F.lit('Total').alias('Cat'),
         F.sum(fs.col_name).alias("{}").format(col_name)
         ])
       )
  

К сожалению, я получаю сообщение об ошибке AttributeError: 'DataFrame' object has no attribute 'col_name' . Есть идеи, что я делаю не так? Заранее благодарим вас!

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

1. удалите fs. — вы не можете использовать средство доступа к точке для столбца со строковой переменной. Попробуйте: F.sum(F.col(col_name)).alias(col_name)

2. Также я не понимаю ваш цикл — вы выполняете каждый столбец по одному за раз? Вероятно, вы можете достичь того же с помощью чего-то вроде: df.union(df.select(F.lit("Total").alias("Cat"), *[F.sum(F.col(c)).alias(c) for c in df.columns if c != 'Cat'])