从PySpark阵列列中删除重复项

时间:2019-01-14 16:43:26

标签: python apache-spark pyspark apache-spark-sql

我有一个包含CloudWatch列的PySpark数据框。该列包含数组中需要删除的重复字符串。例如,一行条目可能看起来像console.logs()。假设我的数据框名为ArrayType(StringType()),而我的列名为[milk, bread, milk, toast]。我需要类似的东西:

df

我的直觉是对此有一个简单的解决方案,但是在浏览stackoverflow 15分钟之后,我发现没有比分解该列,删除整个数据帧上的重复项然后再进行分组更好的了。 got 是一种我没想到的简单方法,对吗?

我正在使用Spark版本'2.3.1'。

1 个答案:

答案 0 :(得分:5)

对于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 + groupBycollect_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"))