如何解决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_list
或collect_set
函数来获取 descriptor
值。
-
collect_list
,collect_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|
+---+------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。