如何将 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] |
+-------+----------+
我需要处理一个数据集来识别频繁项集。所以输入列必须是一个向量。原始列是一个用逗号分隔的项目的字符串,所以我做了以下操作:
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] |
+-------+----------+