python - PySpark GroupBy - 如果没有值,则保留值或 Null
问题描述
我在 PySpark 中编码,并且有一个包含标记及其相关短语的数据框。同一个短语可以出现在多行中,所以我想分组以便只有一行短语,但我想保留具有关联描述符的那个。如果没有描述符,我想保留一行为空。示例数据集:
+------------------------------------+--------+-------+---------+------------+-----------+
| 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
orcollect_set
函数获取descriptor
值。
collect_list
,在这种情况下collect_set
不保留null值,否则用 string 替换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|
+---+------+
推荐阅读
- php - 依赖项中的 Slim 错误找不到控制器
- c# - ChannelData 正在返回 null
- c# - 提高 Excel 文件读取速度
- c - 生成“确定性”浮点运算的标志。指针与“快速数学”对齐?
- python - 有效地遍历字符串列表以获得成对 WMD 距离矩阵
- angular - API调用期间不重新加载页面看不到数据
- python - 将带有值的比较运算符传递给函数
- python - 禁止 save() 以防止由于未保存的相关对象 'xxxxxxxx' 而导致数据丢失
- intellij-idea - 如何在 IntelliJ 中自定义创建单元测试?
- angular - 更新子状态(例如重置表单)