Python PySpark GroupBy-保留值,如果没有值,则为Null
我用PySpark编码,有一个数据帧,其中有标记和相关短语。同一个短语可以出现在多行中,因此我希望分组,以便该短语只有一行,但我希望保留具有关联描述符的一行。若并没有描述符,我想保留一行为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
+------------------------------------+--------+-------+---------+------------+-----------+
| 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
不保留null值,在本例中使用,否则替换为stringcollect\u set
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。谢谢