как подсчитать значения в столбцах для одинаковых элементов - PullRequest
0 голосов
/ 07 мая 2020

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

+------------+------------+-------------+
|          id|     column1|      column2|
+------------+------------+-------------+
|           1|           1|            5|
|           1|           2|            5|
|           1|           3|            5|
|           2|           1|           15|
|           2|           2|            5|
|           2|           6|            5|
+------------+------------+-------------+

Как получить максимальное значение столбца 1? А как получить сумму значений в столбце 2? Чтобы получить такой результат:

+------------+------------+-------------+
|          id|     column1|      column2|
+------------+------------+-------------+
|           1|           3|           15|
|           2|           6|           25|
+------------+------------+-------------+

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Все, что вам нужно, это groupBy, чтобы сгруппировать соответствующие значения id и использовать агрегатные функции sum и max с agg

Функции взяты из пакета org.apache.spark.sql.functions._.

import spark.implicits._
import org.apache.spark.sql.functions._

val input = Seq(
        (1, 1, 5),
        (1, 2, 5),
        (1, 3, 5),
        (2, 1, 15),
        (2, 2, 5),
        (2, 6, 5)
   ).toDF("id", "col1", "col2")

val result = input
        .groupBy("id")
        .agg(max(col("col1")),sum(col("col2")))
        .show()
2 голосов
/ 07 мая 2020

Если вы знакомы с sql, то ниже представлена ​​версия sql, использующая функции group by, max и sum

import spark.implicits._
  import org.apache.spark.sql.functions._

  val input = Seq(
    (1, 1, 5),
    (1, 2, 5),
    (1, 3, 5),
    (2, 1, 15),
    (2, 2, 5),
    (2, 6, 5)
  ).toDF("id", "col1", "col2").createTempView("mytable")

spark.sql("select id,max(col1),sum(col2) from mytable group by id").show

Результат:

+---+---------+---------+
| id|max(col1)|sum(col2)|
+---+---------+---------+
|  1|        3|       15|
|  2|        6|       25|
+---+---------+---------+

2 голосов
/ 07 мая 2020

Используйте .groupBy и агг (max(column1),sum(column2)) для этого случая

#sample data
df=spark.createDataFrame([(1,1,5),(1,2,5),(1,3,5),(2,1,15),(2,2,5),(2,6,5)],["id","column1","column2"])

from pyspark.sql.functions import *

df.groupBy("id").\
agg(max("column1").alias("column1"),sum("column2").alias("column2")).\
show()
#+---+-------+-------+
#| id|column1|column2|
#+---+-------+-------+
#|  1|      3|     15|
#|  2|      6|     25|
#+---+-------+-------+
...