Python PySpark GroupBy-保留值,如果没有值,则为Null

Python PySpark GroupBy-保留值,如果没有值,则为Null,python,apache-spark,pyspark,apache-spark-sql,Python,Apache Spark,Pyspark,Apache Spark Sql,我用PySpark编码,有一个数据帧,其中有标记和相关短语。同一个短语可以出现在多行中,因此我希望分组,以便该短语只有一行,但我希望保留具有关联描述符的一行。若并没有描述符,我想保留一行为null。 示例数据集: +------------------------------------+--------+-------+---------+------------+-----------+ | SENTENCE | SENT_ID| TO

我用PySpark编码,有一个数据帧,其中有标记和相关短语。同一个短语可以出现在多行中,因此我希望分组,以便该短语只有一行,但我希望保留具有关联描述符的一行。若并没有描述符,我想保留一行为null。 示例数据集:


+------------------------------------+--------+-------+---------+------------+-----------+
|            SENTENCE                | SENT_ID|  TOKEN| TOKEN_ID|     PHRASE | DESCRIPTOR|
+------------------------------------+--------+-------+---------+------------+-----------+
|The handle of the old razor blade...|       1| handle|        2|      handle|       null|
|The handle of the old razor blade...|       1|  razor|        6| razor blade|       null|
|The handle of the old razor blade...|       1|  blade|        7| razor blade|        old|
我希望它看起来像:

+------------------------------------+--------+------------+-----------+
|            SENTENCE                | SENT_ID|     PHRASE | DESCRIPTOR|
+------------------------------------+--------+------------+-----------+
|The handle of the old razor blade...|       1|      handle|       null|
|The handle of the old razor blade...|       1| razor blade|        old|
永远不会出现同一短语有不同描述符的情况。我在想
df.groupby('REVIEW_ID'、'SENT_ID'、'PHRASE')
,但不确定如何引入描述符。

使用
收集列表
收集集
函数获取
描述符

  • collect\u list
    collect\u set
    不保留null值,在本例中使用,否则替换为string
    null
示例:

df.show()
#+---+----+------+
#| id|name|salary|
#+---+----+------+
#|  1|   a|   100|
#|  1|null|   200|
#|  1|null|   300|
#+---+----+------+

#grouping by id and collecting names

df.groupBy("id").agg(collect_list(col("name")).alias("list")).show()
#+---+----+
#| id|list|
#+---+----+
#|  1| [a]|
#+---+----+

#preserve nulls without duplicates
df.groupBy("id").\
agg(concat_ws(",",collect_list(when(isnull(col("name")),lit('null')).otherwise(col("name")))).alias("list")).\
show()
#+---+-----------+
#| id|       list|
#+---+-----------+
#|  1|a,null,null|
#+---+-----------+

#preserve nulls without duplicates
df.groupBy("id").\
agg(concat_ws(",",collect_set(when(isnull(col("name")),lit('null')).otherwise(col("name")))).alias("list")).\
show()
+---+------+
| id|  list|
+---+------+
|  1|a,null|
+---+------+

展示你的尝试。如果有两个非空值,您希望发生什么?不确定尝试什么。从来没有出现过有2个非空的情况。在这种情况下,我希望第一个id 1只返回for列表。但是如果有一个id 2,并且它只有空值,那么我只想返回1个空值使用groupBy之后的
collect\u set
,而不是
collect\u list
。检查我的答案我在
#preserve nulls without duplicates
部分添加了完整语法。但是在您的示例中,我不希望为id 1保留null,因为它有一个。我只希望在没有其他非null值的情况下使用null,因为您的第一个示例看起来只需要一个空列表就可以使用null。谢谢