Происходя из среды SQL Server, я - новичок относительно HBase, но технология надеется быть подходящим вариантом для того, что мы делаем, и стоимость является определенно правильной!
Я должен вести список записей в журнале, которые обычно я создал бы в RDBS как:
создайте таблицу Log (Интервал UserID, интервал SiteID, Page varchar (50), Дата smalldatetime)
где у одного пользователя может быть 0 или 1 000 строк в этой простой таблице. Типичные запросы состояли бы в том, чтобы найти все строки для одного пользователя или все строки для одного пользователя на одном сайте.
Как это переводит в "карту" в HBase, где нет никакого "ключа строки", И то же (SiteID, Страница) может много раз появляться. Моя первая мысль - то, что UserID является ключом строки, но я все еще не понимаю "семейства столбцов" и другую терминологию достаточно хорошо, чтобы понять, как установить таблицу для содержания этих данных, где тот UserID может иметь многих (SiteID, Страница, Дата) "строки".
Любое направление ценится!
Один из подходов заключается в том, чтобы сделать составные ключи строк из вашего userid+siteid
Настройте таблицу на ведение того количества записей журнала, которое вы хотите для данной страницы, и храните ваши данные как новые версии каждый раз (вручную устанавливая временную метку, если необходимо).
Поскольку HBase хранит временные метки для каждой ячейки, вам не нужен отдельный столбец для времени доступа.
Таким образом, у вас будет таблица с содержимым примерно следующего вида
Row Page
user1:site1 www.example.com/index.html@1234567890
www.example.com/somepage.html@123456800
www.example.com/someotherpage.html@123456900
www.example.com/index.html@123457123
user1:site2 blahblah
user2:site1 etc...
Чтобы разобраться с двумя примерами запросов:
Для поиска всех строк пользователей вы должны сделать сканирование (не забудьте установить maxVersion) от userx:0 до userx+1:0, а затем разобрать идентификаторы сайтов из каждой строки результатов
Чтобы получить все страницы для определенного пользователя/сайта, просто сделайте сканирование от userx:sitex до userx:sitex+1. Насколько я знаю, вы не можете установить maxVersions в get, так что это не вариант.
Проще говоря, семейства столбцов представляют собой группы данных, которые вы хотите хранить вместе... Предположительно, вы будете довольно часто читать данные из них одновременно. Размещение столбцов в отдельных семействах приведет к тому, что данные будут храниться отдельно, поэтому вы получите более быстрое чтение, когда вам нужен только один столбец, но вам придется читать два разных места, чтобы получить оба столбца.
Конечно, в зависимости от ваших других потребностей вы можете захотеть использовать другой подход. Я бы настоятельно рекомендовал прочитать статью о больших таблицах, чтобы лучше понять структуру HBase (поскольку она сильно основана на bigtable).
Чтобы лучше понять внутреннюю структуру HBase, блог Ларса Джорджа также очень полезен.