Случайная выборка из столбца ArrayType Pyspark - PullRequest
1 голос
/ 11 февраля 2020

У меня есть столбец в фрейме данных Pyspark со структурой, подобной

Column1
[a,b,c,d,e]
[c,b,d,f,g,h,i,p,l,m]

Я хотел бы вернуть другой столбец со случайным выбором каждого массива в каждой строке, количество, указанное в функции .

Итак, что-то вроде data.withColumn("sample", SOME_FUNCTION("column1", 5)) return:

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 Ответ

3 голосов
/ 12 февраля 2020

Для свечей 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]|
+-----------------------------+
...