Я хотел получить язык, который имеет самый высокий средний рейтинг в pyspark

#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. ну, приведенный выше код не выполняет никакой агрегации в столбце язык, поэтому, если вы используете несколько языков в строке, в других частях вашего кода может быть что-то не так.