2014-01-06 5 views
1

Я довольно новичок в Hadoop и HBase, пытаясь узнать и оценить, может ли он использоваться для моего варианта использования. И, будучи новым для Java (я в основном разработчик Perl/Unix и DB), я пытаюсь получить решение в оболочке Hbase, если это возможно.HBase shell - Получить значения столбца только(), но не имя столбца

У меня есть таблица HBase (схема ниже), где я пытаюсь реализовать исторические данные (которые могут использоваться для аудита и аналитики).

Предположим, основную структуру, как показано ниже,

rowkey 'cf1:id', 'cf1:price', 'cf1:user', 'cf1:timestamp' 

Теперь RowKey - инструмент или любой объект идентификатор - используя эту функцию, чтобы определить, какие цв имеет самые последние данные. Первая запись будет иметь 1 в качестве ее значения и перейти на пользователь - пользователь, обновленные данные

например.

первоначально данные выглядит,

hbase(main):009:0> scan 'price_history' 
    ROW COLUMN+CELL                             
    row1  column=cf1:id, timestamp=1389020633920,value=1 
    row1  column=cf1:pr, timestamp=1389020654614, value=109.45 
    row1  column=cf1:us, timestamp=1389020668338, value=feed 
    row2  column=cf1:id, timestamp=1389020687334, value=1 
    row2  column=cf1:pr, timestamp=1389020697880, value=1345.65 
    row2  column=cf1:us, timestamp=1389020708403, value=feed 

Теперь предположим row2 или инструмент 2 обновляется на тот же день с новой ценой,

hbase(main):003:0> scan 'price_history' 
    ROW     COLUMN+CELL       
    row1     column=cf1:id, timestamp=1389020633920, value=1 
    row1     column=cf1:pr, timestamp=1389020654614, value=109.45 
    row1     column=cf1:us, timestamp=1389020668338, value=feed 
    row2     column=cf1:id, timestamp=1389020859674, value=2 
    row2     column=cf1:pr, timestamp=1389020697880, value=1345.65 
    row2     column=cf1:pr1, timestamp=1389020869856, value=200 
    row2     column=cf1:us, timestamp=1389020708403, value=feed 
    row2     column=cf1:us1, timestamp=1389020881601, value=user1` 

Если вы видите идентификатор изменяется на 2, чтобы указать второй набор данных является последним. и добавлены новые значения или столбцы.

То, что я хочу,

1) Can I fetch the value of columns id? i.e. the output should be 1 or 2 and not all other attribs 
    2) Based on the above o/p i will fetch the further data, but can I also have a search and o/p as value of rowkey? i.e. something like give me o/p of row having VALUE as row1 (I can have list of row1, row2, rown..) 

Пожалуйста помогите, если это возможно в HBase оболочек как можно больше (Другие решения также приветствуется)

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

Спасибо.

ответ

2

Это очень сложно сделать в оболочке, не делая много выходных труб и получая результаты. Форматирование вывода оболочки также затрудняет из-за того, как он разбивает линии. Более легкое решение, чем написание Java, - это написать сканер в рубине. HBase поставляется с jruby jar и позволяет выполнять рубиновые скрипты.

include Java 
import "org.apache.hadoop.hbase.client.Scan" 
import "org.apache.hadoop.hbase.util.Bytes" 
import "org.apache.hadoop.hbase.client.HTable" 

config = HBaseConfiguration.create() 
family = Bytes.toBytes("family-name") 
qual = Bytes.toBytes("qualifier" 
scan = Scan.new() 
scan.addColumn(family, qualifier) 

table = HTable.new(config, "table-name") 
scanner = table.getScanner(scan) 
scanner.each do |result| 
    keyval = result.getColumnLatest(family, qualifier) 
    puts "#{Bytes.toDouble(keyval.getValue())}" 
end 

Это должно быть довольно близко, вы можете добавить дополнительные данные к выходу, например, к строке. Для запуска просто используйте hbase org.jruby.Main your_ruby_file.rb

+0

Спасибо за ответ. – Mihir

+0

Да, я тоже согласен, что это будет сложно с Shell, но поскольку я сейчас работаю над POC, я очень быстро решил завершить разработку hte, и с моим очень ограниченным знанием Java думал, могу ли я достичь. Этот подход выглядит хорошо, чтобы начать работать. Спасибо за эту идею, и я буду работать над этим. – Mihir

Смежные вопросы