我有一个包含ArrayType(StringType())
列的 PySpark 数据帧。此列包含我需要删除的数组中的重复字符串。例如,一行条目可能看起来像 [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"))