Spark создает строку, содержащую сумму для каждого столбца (например, общий итог для каждого столбца) - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть фрейм данных, который выглядит следующим образом

+-----------+-----------+-----------+
|salesperson|     device|amount_sold|
+-----------+-----------+-----------+
|       john|   notebook|          2|
|       gary|   notebook|          3|
|       john|small_phone|          2|
|       mary|small_phone|          3|
|       john|large_phone|          3|
|       john|     camera|          3|
+-----------+-----------+-----------+

, и я преобразовал его, используя функцию pivot, с помощью столбца Total

+-----------+------+-----------+--------+-----------+-----+
|salesperson|camera|large_phone|notebook|small_phone|Total|
+-----------+------+-----------+--------+-----------+-----+
|       gary|     0|          0|       3|          0|    3|
|       mary|     0|          0|       0|          3|    3|
|       john|     3|          3|       2|          2|   10|
+-----------+------+-----------+--------+-----------+-----+

, но я бы как фрейм данных со строкой ( Total ), которая также будет содержать сумму для каждого столбца, как показано ниже:

+-----------+------+-----------+--------+-----------+-----+
|salesperson|camera|large_phone|notebook|small_phone|Total|
+-----------+------+-----------+--------+-----------+-----+
|       gary|     0|          0|       3|          0|    3|
|       mary|     0|          0|       0|          3|    3|
|       john|     3|          3|       2|          2|   10|
|      Total|     3|          3|       5|          5|   16|
+-----------+------+-----------+--------+-----------+-----+

Возможно ли сделать это в Spark, используя Scala / Python ? (Предпочтительно Scala и с использованием Spark) и, если возможно, без использования Union

TIA

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Вы можете сделать что-то вроде ниже:

val columns = df.columns.dropWhile(_ == "salesperson").map(col)

//Use function `sum` on each column and union the result with original DataFrame.
val withTotalAsRow = df.union(df.select(lit("Total").as("salesperson") +: columns.map(sum):_*)) 

//I think this column already exists in DataFrame
//Append another column by adding value from each column
val withTotalAsColumn = withTotalAsRow.withColumn("Total", columns.reduce(_ plus _))
0 голосов
/ 29 апреля 2020

С помощью spark Scala вы можете добиться этого, используя следующий фрагмент кода.

// Assuming spark session available as variable named 'spark'
import spark.implicits._
val resultDF = df.withColumn("Total", sum($"camera", $"large_phone", $"notebook", $"small_phone"))
...