MapReduce для нескольких типов хранилищ данных в Google App Engine

Я только что посмотрел Пакетную обработку данных в сеансе App Engine в Google I / O 2010 , прочитал некоторые части статьи MapReduce из Google Research и теперь я подумываю использовать MapReduce в Google App Engine для реализации системы рекомендаций на Python.

Я предпочитаю использовать appengine-mapreduce вместо API очереди задач, потому что первый предлагает легкую итерацию по всем экземплярам того или иного типа, автоматическое пакетирование, автоматическое объединение задач и т. Д. Проблема в том, что моя рекомендательная система должна вычислять корреляцию между экземплярами две разные модели, т. е. экземпляры двух разных видов.

Пример: У меня есть две модели: User и Item. У каждого есть список тегов в качестве атрибута. Ниже приведены функции для расчета корреляции между пользователями и элементами. Обратите внимание, что calculateCorrelation должен вызываться для каждой комбинации пользователей и элементов:

def calculateCorrelation(user, item):
    return calculateCorrelationAverage(u.tags, i.tags)

def calculateCorrelationAverage(tags1, tags2):
    correlationSum = 0.0
    for (tag1, tag2) in allCombinations(tags1, tags2):
        correlationSum += correlation(tag1, tag2)
    return correlationSum / (len(tags1) + len(tags2))

def allCombinations(list1, list2):
    combinations = []
    for x in list1:
        for y in list2:
            combinations.append((x, y))
    return combinations             

Но что calculateCorrelation не является допустимым Mapper в appengine-mapreduce, и, возможно, эта функция даже несовместима с Концепция вычислений MapReduce. Тем не менее, мне нужно быть уверенным ... для меня было бы здорово иметь такие преимущества appengine-mapreduce, такие как автоматическое пакетирование и объединение задач.

Есть ли какое-нибудь решение для этого?

Должен ли я определять свой собственный InputReader? Новый InputReader, который считывает все экземпляры двух разных типов, совместим с текущей реализацией appengine-mapreduce?

Или мне следует попробуйте следующее?

  • Объедините все ключи всех сущностей этих двух типов, два на два, в экземпляры новой Модели (возможно, используя MapReduce)
  • Выполните итерацию с использованием преобразователей по экземплярам этой новой Модели
  • Для каждой Например, используйте ключи внутри него, чтобы получить две сущности разных типов и вычислить корреляцию между ними.
6
задан fjsj 24 September 2010 в 17:36
поделиться