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

问题描述

我正在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_listcollect_set函数来获取 descriptor 值。

  • collect_listcollect_set在这种情况下不会保留 null 值,否则将其替换为字符串null

Example:

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|
+---+------+