Получить все семьи в hbase - PullRequest
3 голосов
/ 01 мая 2011

У меня есть таблица hbase с

строки: слово, семьи: дата

Я хочу получить сканер для всех слов на дату 'd', как я могу это сделать? Поэтому я не хочу указывать значение строки.

Ответы [ 3 ]

5 голосов
/ 01 мая 2011

Ваш вопрос неясен, откуда вы пытаетесь получить сканер, поэтому я собираюсь рассматривать его так, как будто это из командной строки HBase.Я использовал библиотеку Thrift для взаимодействия с hbase, и команды CLI довольно явно это отражают.Я предполагаю, что они также будут хорошо работать с любым другим интерфейсом, для которого вы получаете сканер.

Чтобы получить все строки для определенного семейства столбцов, вы должны использовать следующую команду

scan 'table_name', {COLUMNS => 'col_family:'}

Для вашего случая (минус «имя_таблицы», потому что я этого не знаю) это будет выглядеть примерно так:

scan 'yourTable', {COLUMNS => 'd:'}

Это вернет все строки семейства столбцов d.

Если вы также хотите указать, с чего начинать RowKeys, это будет выглядеть примерно так:

scan 'yourTable', {COLUMNS => 'd:', STARTROW => 'word'}

Эта команда НАЧНЕТСЯ с клавиши строки word и получит все строки после этой точки.Если вы хотите ограничить его значением RowKey word, вам также нужно будет добавить STOPROW.STOPROW не входит в результаты.Таким образом, вы НЕ МОЖЕТЕ делать scan 'yourTable', {COLUMNS => 'd:', STARTROW => 'word', STOPROW => 'word'}, поскольку это ничего не вернет.Указание STOPROW требует некоторых знаний о значениях RowKey.Я не знаю ваших ценностей, поэтому сложно привести хороший пример.Я часто использую следующий символ (в наборе ASCII) для последнего символа моего начального ряда.В вашем примере я бы попробовал

scan 'yourTable', {COLUMNS => 'd:', STARTROW => 'word', STOPROW => 'wore'}

Я не собираюсь обещать, что это будет работать постоянно, но, скорее всего, в большинстве случаев будет работать.Возможно, во всех случаях, я просто не сработал.:)

Надеюсь, это поможет.

Хороший ресурс для команд оболочки HBase - http://wiki.apache.org/hadoop/Hbase/Shell.

0 голосов
/ 28 января 2013

Попробуйте это:

     HTable t = new HTable(conf,"YourROW");
     ResultScanner scanner = t.getScanner(new Scan());    
     for (Result rr = scanner.next(); rr != null; rr = scanner.next()) 
     {
           if (rr.getValue("YourFamily" , "YourQualifier").equals(Bytes.toBytes("d"))
           {
                Get g = new Get(key);
                Result row = t.get(g);
                System.out.println("" + row.toString()); //print all data from this row
           }
     }
0 голосов
/ 14 ноября 2011

Я предполагаю, что вы говорите об использовании команды сканирования Java API

Если я правильно понимаю вашу структуру, у вас нет способа извлечь слова по дате без полного сканирования таблицы.- вы можете setFilter на скане, но все равно придется идти в каждую строку, чтобы проверить, что

Вы не указали, но я предполагаю, что каждое слово может встречаться во многих датах (если вы имели в виду, что у вас есть семья на каждую дату, обратите внимание, что не рекомендуется иметь более 2-3 семей)

Если вы хотите относительно эффективный способ хранения, который я бы посоветовал вам изменитьструктурировать в Key Word0xDate и сохранить дату в метке времени, а затем около 1 байта в качестве данных (чтобы существовала строка). По хранилищу это будет то же самое, что и ваше текущее решение (плюс 2 байта, которые вы можете сместить насокращая имена семейства и квалификатора), и вы сможете получить сканирование для отметки времени или диапазона отметок времени ( setTimestamp и setTimeRange соответственно), которые будут более эффективными, чем hbaseпропустит файлы, в которых хранятся нерелевантные временные метки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...