Вопрос

Учитывая следующий сценарий схемы HBase ( из официального FAQ ) ...

  

Как бы вы разработали таблицу Hbase?   для связи многих ко многим между   две сущности, например, Студент и   Курс?

     

Я бы определил две таблицы:

     

Студент: идентификатор студента данные студента   (название, адрес, ...) курсы (использование   Идентификаторы курса в качестве классификаторов столбцов здесь)

     

Курс: идентификатор курса данные курса (название,   учебный план, ...) студенты (использовать студент   идентификаторы столбцов здесь)

     

Эта схема дает вам быстрый доступ к   запросы, показать все классы для   студент (ученический стол, курсы   семья) или все ученики для одного класса   (столы для курсов, семья студентов).

Как бы вы удовлетворили запрос: " Дайте мне всех студентов, у которых есть хотя бы два общих курса " ;? Можете ли вы создать " запрос " в HBase, который вернет этот набор, или вам нужно извлечь все соответствующие данные и самостоятельно обработать их в коде?

Это было полезно?

Решение

Запрос, как описано, лучше подходит для реляционной базы данных. Однако вы можете быстро ответить на запрос, предварительно рассчитав результат. Например, у вас может быть таблица, в которой ключом является общее количество классов, а ячейками являются отдельные учащиеся, у которых есть общие классы ключей.

Вы можете использовать вариант этого для ответа на такие вопросы, как «какие учащиеся в классе X и классе Y»: использовать классы в качестве фрагментов ключа (в алфавитном порядке или, по крайней мере, непротиворечиво), и снова каждый столбец - студент.

Другие советы

Этот тип запросов недоступен через API 0.20.0. Я не уверен, есть ли какие-либо планы на это (я сомневаюсь, что это появится в ближайшее время). На веб-сайте HBase вы найдете некоторые подробности, которые могут ответить на этот вопрос.

Вам нужно будет вычислить ответ в своем собственном приложении (хотя я бы хотел, чтобы его ошиблись).

Используйте файлер для достижения этой цели.

SingleValueFiler filer = new SingleValueFiler (и ваши аргументы основаны на API);

добавить это в Scan (org.apache.hadoop.hbase.client.Scan scan = new Scan ();                    scan.setFiler (фильтр);

Похоже, что MapReduce может быть одним из способов решения этой проблемы; к сожалению, это не даст мгновенного результата, если это будет сделано на лету. Просто подумав, вы могли бы на этапе карт подсчитать, сколько раз пара учеников оказалась в одном классе. Во время фазы сокращения вы можете суммировать пары и выписывать (выдавать) пары с суммой 2 или более. Этот подход можно использовать для предварительной генерации индекса (как предлагалось ранее), который указывает пары учеников с «x». курсы общие. Ключом к такому индексу может быть что-то вроде «X / Student1_Key / Student2_Key», где X - это общее количество курсов, которые они имеют, и. Сканирование диапазона по индексу (например, X > = 2) даст вам ответ. Учитывая собственную интеграцию HBase с MapReduce, решение в этом направлении должно быть простым.

Кроме того, следуя модели BigTable, вам даже не нужно создавать две таблицы. Просто добавьте перед каждым ключом записи знак "вид" такие как курс: или студент :. Поскольку строки упорядочены лексикографически, они легко сканируются по виду. Заполните (или сгенерируйте) столбцы, необходимые для поддержки свойств для каждого вида. Так как HBase поддерживает очень разреженные таблицы, это работает хорошо. Посмотрите эту превосходную презентацию по выбору ключей и разработке индексов с помощью BigTable: http: // www.google.com/events/io/2009/sessions/BuildingScalableComplexApps.html . Эта презентация действительно помогла мне понять, как хранить вещи в базах данных, таких как HBase, для эффективного поиска.

Но вернемся к первоначальному вопросу: кажется, что при работе с HBase вам действительно нужно знать, как использовать ваши данные, поэтому для быстрого получения ответов можно заранее разработать соответствующие индексы. Похоже, что случайные специальные запросы всегда будут работать с этой моделью.

Во всяком случае, я тоже новичок в этом, поэтому видение таких проблем и возможных решений помогает!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top