Как выбрать соответствующее значение другого столбца, когда процентная часть возвращает одно значение определенного столбца на основе groupby? - PullRequest
0 голосов
/ 18 октября 2018

Я новичок в 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

1 Ответ

0 голосов
/ 18 октября 2018

Это потому, что вы группируете только по идентификатору.Таким образом, используя первую функцию, вы фактически выбираете случайное значение из столбца диапазонов.

Одним из решений будет создание второго фрейма данных, который содержит отображение оценки в диапазон, а затем присоединение этого значения обратно к результатам.DF в конце.

>>> df.registerTempTable("df") # Register first before selecting from 'df'
>>> map = spark.sql('select ranges, score from df')

>>> results = spark.sql('select percentile_approx(score,0.95) as score from subset GROUP BY id')

>>> results .registerTempTable("results ") 
>>> final_result = spark.sql('select r.score, m.ranges from results as r join map as m on r.score = m.score')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...