来自 ArrayType Pyspark 列的随机样本
Posted
技术标签:
【中文标题】来自 ArrayType Pyspark 列的随机样本【英文标题】:Random sample from column of ArrayType Pyspark 【发布时间】:2020-02-11 19:47:15 【问题描述】:我在 Pyspark 数据框中有一列,其结构类似于
Column1
[a,b,c,d,e]
[c,b,d,f,g,h,i,p,l,m]
我想返回另一列,随机选择每行中的每个数组,函数中指定的数量。
类似data.withColumn("sample", SOME_FUNCTION("column1", 5))
的返回:
sample
[a,b,c,d,e]
[c,b,h,i,p]
希望避免使用 python UDF,感觉应该有一个可用的函数??
这行得通:
import random
def random_sample(population):
return(random.sample(population, 5))
udf_random = F.udf(random_sample, T.ArrayType(T.StringType()))
df.withColumn("sample", udf_random("column1")).show()
但正如我所说,最好避免使用 UDF。
【问题讨论】:
【参考方案1】:对于 spark 2.4+,使用 shuffle
和 slice
:
df = spark.createDataFrame([(list('abcde'),),(list('cbdfghiplm'),)],['column1'])
df.selectExpr('slice(shuffle(column1),1,5)').show()
+-----------------------------+
|slice(shuffle(column1), 1, 5)|
+-----------------------------+
| [b, a, e, d, c]|
| [h, f, d, l, m]|
+-----------------------------+
【讨论】:
以上是关于来自 ArrayType Pyspark 列的随机样本的主要内容,如果未能解决你的问题,请参考以下文章
在 PySpark 中将 ArrayType(StringType()) 的列转换为 ArrayType(DateType())
在 PySpark 中将 StringType 转换为 ArrayType
Pyspark - 循环通过 structType 和 ArrayType 在 structfield 中进行类型转换