Dataframe Pyspark数据帧通过消除空值合并行

Dataframe Pyspark数据帧通过消除空值合并行,dataframe,apache-spark,pyspark,apache-spark-sql,null,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,Null,我有一个像这样的Pyspark数据帧 +-----------+-------+----------+-------+-------+---------+ | ID_PRODUCT| VALUE | TIMESTAMP| SPEED | CODE | FIRMWARE| +-----------+-------+----------+-------+-------+---------+ | 3| 1| null| 124,21| null| n

我有一个像这样的Pyspark数据帧

+-----------+-------+----------+-------+-------+---------+
| ID_PRODUCT| VALUE | TIMESTAMP| SPEED |  CODE | FIRMWARE|
+-----------+-------+----------+-------+-------+---------+
|          3|      1|      null| 124,21|   null|     null|
|          5|      2|      null| 124,23|   null|     null|
|          5|      2|      null| 124,26|   null|     null|
|          6|      4|      null| 124,24|   null|     null|
|          3|      1|      null|   null|   6764|     null|
|          5|      2|      null|   null|   6772|     null|
|          5|      2|      null|   null|   6782|     null|
|          6|      4|      null|   null|   6932|     null|
|          3|      1|      null|   null|   null|        1|
|          5|      2|      null|   null|   null|        1|
|          5|      2|      null|   null|   null|        1|
|          6|      4|      null|   null|   null|        1|
|          3|      1|  17:18:04|   null|   null|     null|
|          5|      2|  18:22:40|   null|   null|     null|
|          5|      2|  18:25:29|   null|   null|     null|
|          6|      4|  18:32:18|   null|   null|     null|
+-----------+-------+----------+-------+-------+---------+

我想合并它的列,它应该像这样,例如:

+-----------+-------+----------+-------+-------+---------+
| ID_PRODUCT| VALUE | TIMESTAMP| SPEED |  CODE | FIRMWARE|
+-----------+-------+----------+-------+-------+---------+
|          3|      1|  17:18:04| 124,21|   6764|        1|
|          5|      2|  18:22:40| 124,23|   6772|        1|
|          5|      2|  18:25:29| 124,26|   6782|        1|
|          6|      4|  18:32:18| 124,24|   6932|        1|
+-----------+-------+----------+-------+-------+---------+

我尝试使用:

df = df.groupBy('id').agg(*[f.first(x,ignorenulls=True) for x in df.columns])
然而,这只是给我列的第一个值,我需要所有的记录。因为对于一个ID,我有不同的注册时间戳和不同的注册值,我现在失去了它们


感谢您的建议

我不确定这是否是您想要的,但基本上您可以为每个id和列创建一个收集列表,并分解所有结果列表。这样,每个id可以有多个条目

from functools import reduce
import pyspark.sql.functions as F

df2 = reduce(
    lambda x, y: x.withColumn(y, F.explode_outer(y)),
    df.columns[2:], 
    df.groupBy('id_product', 'value').agg(*[F.collect_list(c).alias(c) for c in df.columns[2:]])
).distinct()

它如何知道要与哪一行合并?为什么要合并id为2和6的行?这是一个示例,初始行使用时间戳进行合并。请在问题中提供a,其中包括解决问题所需的所有详细信息。@mck i对其进行了更新:它如何知道哪一行对应于哪一行,如果存在“id_产品”、“值”的多个组合,例如5、2?