#sql #mongodb #apache-spark #pyspark #apache-spark-sql
Вопрос:
Я подключил MongoDB в записной книжке pyspark в базе данных, а затем
rating.createOrReplaceTempView("rat")
Используя этот используемый spark SQL
lan = spark.sql("select language from (select language, avg(imdbRating), max(avg(imdbRating)) as m from rat group by language) group by language having avg(imdbRating) = m").show()
и это выбрасывает эту ошибку:
Исключение анализа: Не разрешается использовать агрегатную функцию в аргументе другой агрегатной функции. Пожалуйста, используйте внутреннюю агрегатную функцию в подзапросе.;;
Есть идеи, где я ошибаюсь.
ИЗМЕНИТЬ: Результат выглядит следующим образом
--------------------
| language|
--------------------
|English, Dutch, F...|
--------------------
Ответ №1:
Вы можете использовать подзапрос и присвоить ранги, чтобы получить язык с максимальным рейтингом:
lan = spark.sql("""
select language
from (
select language, rank() over (order by avg_rating desc) as rn
from (
select language, avg(imdbRating) as avg_rating
from rat
group by language
)
) where rn = 1
""")
Комментарии:
1. Спасибо, это сработало, но результат приходит в одной строке, и я попытался использовать row_number (), но это не сработало, как мне получить эти результаты в разных строках?
2. что вы имеете в виду под разными строками? не могли бы вы пояснить, пожалуйста, на примере?
3. Результат получается в одной строке, например, на английском, французском, хинди и т. Д. Я хочу, чтобы они появлялись в отдельных строках.
4. @RishiPandey вы уверены, что каждая строка в таблице rat имеет только один язык?
5. ну, приведенный выше код не выполняет никакой агрегации в столбце язык, поэтому, если вы используете несколько языков в строке, в других частях вашего кода может быть что-то не так.