Skip to main content
 首页 » 编程设计

python之从 PySpark 数组列中删除重复项

2025年05月04日63mfryf

我有一个包含 ArrayType(StringType()) 列的 PySpark Dataframe。此列包含我需要删除的数组中的重复字符串。例如,一行条目可能看起来像 [milk, bread, milk, toast]。假设我的数据框名为 df,我的列名为 arraycol。我需要这样的东西:

df = df.withColumn("arraycol_without_dupes", F.remove_dupes_from_array("arraycol")) 

我的直觉是有一个简单的解决方案,但在浏览 stackoverflow 15 分钟后,我没有发现比分解列、删除完整数据帧上的重复项,然后再次分组更好的方法。 一定有一种我只是没有想到的更简单的方法,对吧?

我使用的是 Spark 2.4.0 版

请您参考如下方法:

对于 pyspark 2.4+ 版本,您可以使用 pyspark.sql.functions.array_distinct :

from pyspark.sql.functions import array_distinct 
df = df.withColumn("arraycol_without_dupes", array_distinct("arraycol")) 

对于旧版本,您可以使用 explode + groupBy 和 collect_set 通过 API 函数执行此操作,但是 udf 在这里可能更有效:

from pyspark.sql.functions import udf 
 
remove_dupes_from_array = udf(lambda row: list(set(row)), ArrayType(StringType())) 
df = df.withColumn("arraycol_without_dupes", remove_dupes_from_array("arraycol"))