如何将 Spark Dataframe 列从矢量转换为集合?

How to convert a Spark Dataframe column from vector to a set?

我需要处理一个数据集来识别频繁项集。所以输入列必须是一个向量。原始列是一个用逗号分隔的项目的字符串,所以我做了以下操作:

functions.split(out_1['skills'], ',')

问题是,对于某些行,我在 skills 中有重复的值,这导致在尝试识别频繁项集时出错。

我想将向量转换为集合以删除重复的元素。像这样:

functions.to_set(functions.split(out_1['skills'], ','))

但是我找不到将列从向量转换为集合的函数,即没有 to_set 函数。

我怎样才能完成我想要的,即从向量中删除重复的元素?

您可以使用 functions.udf(set) 将 python 中的 set 函数转换为 udf,然后将其应用于数组列:

df.show()
+-------+
| skills|
+-------+
|a,a,b,c|
|  a,b,c|
|c,d,e,e|
+-------+

import pyspark.sql.functions as F
df.withColumn("unique_skills", F.udf(set)(F.split(df.skills, ","))).show()
+-------+-------------+
| skills|unique_skills|
+-------+-------------+
|a,a,b,c|    [a, b, c]|
|  a,b,c|    [a, b, c]|
|c,d,e,e|    [c, d, e]|
+-------+-------------+

出于效率原因,建议尽可能使用本机 spark 函数而不是 UDF。有一个专门的功能可以在数组列中只保留唯一的项目: array_distinct() introduced in spark 2.4.0

from pyspark import Row
from pyspark.shell import spark
import pyspark.sql.functions as F

df = spark.createDataFrame([
    Row(skills='a,a,b,c'),
    Row(skills='a,b,c'),
    Row(skills='c,d,e,e'),
])

df = df.withColumn('skills_arr', F.array_distinct(F.split(df.skills, ",")))

结果:

+-------+----------+
|skills |skills_arr|
+-------+----------+
|a,a,b,c|[a, b, c] |
|a,b,c  |[a, b, c] |
|c,d,e,e|[c, d, e] |
+-------+----------+