Похоже, что MapReduce может быть одним из способов решения этой проблемы; к сожалению, это не даст мгновенного результата, если это будет сделано на лету.
Просто подумав, вы могли бы на этапе карт подсчитать, сколько раз пара учеников оказалась в одном классе. Во время фазы сокращения вы можете суммировать пары и выписывать (выдавать) пары с суммой 2 или более. Этот подход может быть использован для предварительной генерации индекса (как предлагалось ранее), который указывает пары учеников с общими курсами «х». Ключом к такому индексу может быть что-то вроде «X / Student1_Key / Student2_Key», где X - это общее количество курсов, которые они имеют, и. Сканирование диапазона по индексу (например, X> = 2) даст вам ваш ответ. Учитывая собственную интеграцию HBase с MapReduce, решение в этом направлении должно быть простым.
Кроме того, следуя модели BigTable, вам даже не нужно создавать две таблицы. Просто добавьте к каждому ключу записи такой «вид», как Course: или Student :. Поскольку строки упорядочены лексикографически, они легко сканируются по виду. Заполните (или сгенерируйте) столбцы, необходимые для поддержки свойств для каждого вида. Так как HBase поддерживает очень разреженные таблицы, это работает хорошо. Посмотрите эту превосходную презентацию по выбору ключей и разработке индексов с помощью BigTable: http://www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html. Эта презентация действительно помогла мне понять, как хранить вещи в базах данных, таких как HBase, для эффективного поиска.
Но вернемся к первоначальному вопросу: кажется, что при работе с HBase вы действительно должны знать, как использовать ваши данные, поэтому для быстрого получения ответов можно заранее разработать соответствующие индексы. Похоже, что случайные специальные запросы всегда будут работать с этой моделью.
Во всяком случае, я тоже новичок в этом, так что такие проблемы и возможные решения помогают!