Вы можете группировать по individual_id
и использовать pyspark.sql.functions.first
в качестве функции агрегирования. Вам нужно будет установить для параметра ignorenulls
для first
значение True
:
from pyspark.sql.functions import first
df.groupBy("individual_id").agg(
first("mail", ignorenulls=True).alias("mail"),
first("phone", ignorenulls=True).alias("phone")
).show()
#+-------------+-----------+-----+
#|individual_id| mail|phone|
#+-------------+-----------+-----+
#| 1|a@gmail.com| 123|
#| 2|b@gmail.com| 345|
#+-------------+-----------+-----+
Для обновленного вопроса вы можете использовать pyspark.sql.functions.when
:
from pyspark.sql.functions import when, col
df.groupBy("individual_id").agg(
first("mail", ignorenulls=True).alias("mail"),
first("phone", ignorenulls=True).alias("phone"),
first(when(col("mail").isNotNull(), col("role")), ignorenulls=True).alias("mail_role"),
first(when(col("phone").isNotNull(), col("role")), ignorenulls=True).alias("phone_role"),
).show()
#+-------------+-----------+-----+---------+----------+
#|individual_id| mail|phone|mail_role|phone_role|
#+-------------+-----------+-----+---------+----------+
#| 1|a@gmail.com| 123| seconary| primary|
#| 2|b@gmail.com| 345| primary| secondary|
#+-------------+-----------+-----+---------+----------+