Как объединить несколько строк с общим идентификатором в одну строку (PYSPARK) - PullRequest
0 голосов
/ 20 марта 2020

У меня есть этот dataframe в PySpark. Я хочу получить уникальные значения для col3. В SQL я бы сгруппировал по col1 и получил бы max (col3) как col3

+ ---- + ---- + ---- + | col1 | col2 | col3 | + ---- + ---- + ---- + | 0 | 1 | 0 | | 0 | 1 | 0 | | 0 | 1 | 0 | | 1 | 1 | 0 | | 1 | 1 | 1 | | 1 | 1 | 1 | | 2 | 1 | 0 | | 2 | 1 | 1 | | 2 | 1 | 0 | + ---- + ---- + ---- +

Это ожидаемый результат:

+ ---- + ---- + ---- + | col1 | col2 | col3 | + ---- + ---- + ---- + | 0 | 1 | 0 | | 1 | 1 | 1 | | 2 | 1 | 1 | + ---- + ---- + ---- +

1 Ответ

1 голос
/ 20 марта 2020

Вы можете сделать ту же логику c в pyspark .groupBy на col1, col2 и затем agg получить максимальное значение col3.

  • другим способом будет использование окна row_number функции и partitionby col1, col2 и orderby desc col3 и выберите только rownumber == 1

Example:

df.show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#|   0|   1|   0|
#|   0|   1|   0|
#|   0|   1|   0|
#|   1|   1|   0|
#|   1|   1|   1|
#|   1|   1|   1|
#|   2|   1|   0|
#|   2|   1|   1|
#|   2|   1|   0|
#+----+----+----+

df.groupBy("col1","col2").agg(max("col3").alias("col3")).orderBy("col3").show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#|   0|   1|   0|
#|   1|   1|   1|
#|   2|   1|   1|
#+----+----+----+

Using row_number():

from pyspark.sql.window import Window

w = Window.partitionBy("col1","col2").orderBy(desc("col3"))

df.withColumn("rn", row_number().over(w)).filter(col("rn") == 1).drop("rn").orderBy("col3").show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#|   0|   1|   0|
#|   1|   1|   1|
#|   2|   1|   1|
#+----+----+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...