Хобрук: Ваш путь к мастерству в программировании

Сортировать по 3-му элементу кортежа, затем группировать по первому и присваивать ранг

Я новичок в apache-spark и scala, поэтому прошу прощения, если это тривиальный вопрос.

Я пытаюсь создать рекомендательную систему и иметь RDD в форме (пользователь, продукт, прогнозируемый рейтинг).

Чего я хочу добиться:

Сгруппированные по пользователям, мне нужен список продуктов (отсортированных в порядке убывания рейтинга) и присвоение рейтинга прогнозам на основе этого списка (для каждого пользователя). Может ли кто-нибудь сказать мне, как я смогу этого добиться?

Приведенный ниже код явно не работает, но это то, чего я пытаюсь достичь.

val xyz = ratesAndPreds.map{case ((user,product),(r1,r2)) => (user,product,r2)}

val def = xyz.sortBy(_._3)

val abc = abc.groupByKey()

Любая помощь будет оценена.

23.06.2014

  • что ты уже испробовал? Ваше определение шагов более или менее преобразуется в идентичный код Scala. Может есть какая-то конкретная проблема? 23.06.2014
  • @ ом-ном-ном нет. нет конкретной проблемы. я просто не знаю следующих вещей: 1. как сортировать по 3-му элементу кортежа. 2. как только это будет сделано, как сделать кортеж формы (U, (P, R)), чтобы я мог использовать для него groupByKey()? или если можно сгруппировать без этого, то как это сделать? 23.06.2014
  • @om-nom-nom с использованием обычного sortBy(_._3) дает это значение ошибки sortBy не является членом org.apache.spark.rdd.RDD[(Int, Int, Double)] 23.06.2014
  • Похоже, xyz нужно преобразовать в список, чтобы использовать sortBy 23.06.2014
  • @Gangstead, не могли бы вы сказать мне, как я могу преобразовать его в список, а затем отсортировать? 23.06.2014

Ответы:


1

Это должно делать свое дело:

val groupedByUser = xyz.groupBy(_._1)
val sortedProductsByUser = groupedByUser mapValues { triples =>
  // this is done for every user, for its list of (user, product, rating)
  // (yes, user is thus the same for all the elements of triples here)
  val sortedTriples = triples.sortBy(_._3) // assuming rating has an Ordering, e.g., it's an Int
  val keepOnlyProducts = sortedTriples.map(_._2)
  keepOnlyProducts
}
23.06.2014
  • Ага ! Это работает. Спасибо. Однако не могли бы вы также сказать мне, как передать параметр, чтобы иметь сортировку в порядке убывания. И если возможно, не могли бы вы объяснить, что именно делает mapValues? 23.06.2014
  • Чтобы отсортировать по убыванию, просто измените порядок в sortBy, например, инвертируя аргумент: -_._3. mapValues похож на map, но только часть values. Таким образом, все ключи сохраняются, и для каждого ключа соответствующее значение преобразуется в соответствии с предоставленной функцией. См. scala-lang.org/api/current/ 24.06.2014

  • 2

    Попробуй это

    ratesAndPreds.map( (User,Product,Predicted Rating) => (User,(Product,Predicted Rating) )
                 .groupByKey()
                 .map( (user,x) => (user,f(x) , g(x))
    

    где f(x) преобразует x (который находится в форме (product1,rate1,product2,rate2...)) в List(product1,product2...),

    А g(x) преобразует x в нужную вам скорость.

    Надеюсь, поможет.

    23.06.2014
  • Если я правильно понимаю, то, что вы показали, даст одну оценку всей группе продуктов, верно? Я хочу иметь возможность сортировать (u1,p1,r1),(u1,p2,r2),(u1,p3,r3) по рейтингу. 23.06.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..