У меня есть фрейм данных PySpark, который содержит идентификатор, а затем пару переменных, для которых я хочу вычислить точку 95%.
Часть printSchema ():
root
|-- ID: string (nullable = true)
|-- MOU_G_EDUCATION_ADULT: double (nullable = false)
|-- MOU_G_EDUCATION_KIDS: double (nullable = false)
Я нашел Как получить Percentile, используя фрейм Spark Data и GroupBy в python , но это не с сообщением об ошибке:
perc95_udf = udf(lambda x: x.quantile(.95))
fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", perc95_udf('MOU_G_EDUCATION_ADULT')) \
.withColumn("P95_MOU_G_EDUCATION_KIDS", perc95_udf('MOU_G_EDUCATION_KIDS'))
fanscores.take(2)
AttributeError: у объекта 'float' нет атрибута 'quantile'
Другие попытки UDF, которые я уже пробовал:
def percentile(quantiel,kolom):
x=np.array(kolom)
perc=np.percentile(x, quantiel)
return perc
percentile_udf = udf(percentile, LongType())
fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", percentile_udf(quantiel=95, kolom=genres.MOU_G_EDUCATION_ADULT)) \
.withColumn("P95_MOU_G_EDUCATION_KIDS", percentile_udf(quantiel=95, kolom=genres.MOU_G_EDUCATION_KIDS))
fanscores.take(2)
выдает ошибку: "TypeError: wrapper () получил неожиданный аргумент ключевого слова 'quantiel' "
Мое окончательное испытание:
import numpy as np
def percentile(quantiel):
return udf(lambda kolom: np.percentile(np.array(kolom), quantiel))
fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", percentile(quantiel=95)(genres.MOU_G_EDUCATION_ADULT)) \
.withColumn("P95_MOU_G_EDUCATION_KIDS", percentile(quantiel=95) (genres.MOU_G_EDUCATION_KIDS))
fanscores.take(2)
Дает ошибку:
PickleException: ожидается нулевые аргументы для построенияClassDict (для numpy.dtype)
Как я могу решить эту проблему?