Я новичок в pyspark, нужно немного разъяснений.У меня есть таблица PySpark примерно такая:
+---+-------+-----+-------+
| id| ranges|score| uom|
+---+-------+-----+-------+
| 1| low| 20|percent|
| 1|verylow| 10|percent|
| 1| high| 70| bytes|
| 1| medium| 40|percent|
| 1| high| 60|percent|
| 1|verylow| 10|percent|
| 1| high| 70|percent|
+---+-------+-----+-------+
Я хочу вычислить процентиль значения столбца оценки с заданным процентом как 0,95 , а также хочу, чтобы он возвращал соответствующуюзначение диапазона тоже.Я попытался выполнить этот запрос:
results = spark.sql('select percentile_approx(score,0.95) as score, first(ranges) from subset GROUP BY id')
Я получаю результат примерно так:
+-----+--------------------+
|score|first(ranges, false)|
+-----+--------------------+
| 70| low|
+-----+--------------------+
Возвращает первое неверное значение диапазона, оно должно быть «высоким»,Если я сначала удалю (диапазоны) из моего запроса, это выдаст мне ошибку:
> pyspark.sql.utils.AnalysisException: u"expression 'subset.`ranges`' is
> neither present in the group by, nor is it an aggregate function. Add
> to group by or wrap in first() (or first_value) if you don't care
> which value you get.;;\nAggregate [id#0L],
> [percentile_approx(score#2L, cast(0.95 as double), 10000, 0, 0) AS
> score#353L, ranges#1]\n+- SubqueryAlias subset\n +- LogicalRDD
> [id#0L, ranges#1, score#2L, uom#3], false\n