Вот решение, я взял только три столбца A, B, F для покрытия различий, но это сработает при отсутствии столбцов и строк.По сути, поиск максимума дает ненулевое значение в каждой группе «prodid», а объединение с «prodid» и «snbr» дает желаемый результат.
Но это не работает, если в группе дляcol больше одного определенного значения, а также нулевое значение.Вы можете настроить это решение в соответствии с вашим требованием.
import pyspark.sql.functions as F
df = spark.createDataFrame(
[(10510, 0, 'California', None,None),(10510, 1, None,1,'Cabernet Sauvignon'),(10510, 2, None,None,None),
(26619, 1, None,1,'Cabernet Sauvignon'),(26619, 2, 'Australia',None,'Cabernet Sauvignon'),(26619, 3, 'Australia',1,'Syrah / Shiraz')
], ["prodid", "snbr", "A","B","F"])
df_not_nulls = df.groupBy(
F.col("prodid")
).agg( *(F.max(c).alias(c)
for c in df.columns if c!= 'prodid')
)
df.join(df_not_nulls,"prodid").select(*[F.coalesce(df[c],df_not_nulls[c]).alias(c) for c in df.columns]).show()
, в результате чего
+------+----+----------+---+------------------+
|prodid|snbr| A| B| F|
+------+----+----------+---+------------------+
| 10510| 0|California| 1|Cabernet Sauvignon|
| 10510| 1|California| 1|Cabernet Sauvignon|
| 10510| 2|California| 1|Cabernet Sauvignon|
| 26619| 1| Australia| 1|Cabernet Sauvignon|
| 26619| 2| Australia| 1|Cabernet Sauvignon|
| 26619| 3| Australia| 1| Syrah / Shiraz|
+------+----+----------+---+------------------+