Расширенные запросы в HBase - PullRequest
       29

Расширенные запросы в HBase

8 голосов
/ 17 сентября 2009

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

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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 02 октября 2009

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

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

2 голосов
/ 22 сентября 2009

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

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

1 голос
/ 22 октября 2010

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

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

1 голос
/ 05 мая 2010

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

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

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

...