Hadoop HBase外壳-检索(仅)列值(而不是列名)
我是Hadoop和HBase的新手,尝试学习和评估它是否可以用于我的用例。作为Java新手(我基本上是Perl/Unix和DB开发者),如果可能的话,我会尝试在Hbase shell中获得解决方案 我有一个HBase表(下面的模式),我试图在其中实现历史数据(可用于审计和分析) 假设基本结构如下所示Hadoop HBase外壳-检索(仅)列值(而不是列名),hadoop,hbase,Hadoop,Hbase,我是Hadoop和HBase的新手,尝试学习和评估它是否可以用于我的用例。作为Java新手(我基本上是Perl/Unix和DB开发者),如果可能的话,我会尝试在Hbase shell中获得解决方案 我有一个HBase表(下面的模式),我试图在其中实现历史数据(可用于审计和分析) 假设基本结构如下所示 rowkey 'cf1:id', 'cf1:price', 'cf1:user', 'cf1:timestamp' 现在,, rowkey-仪器或任何对象 id-使用此标识哪个列具有最新数
rowkey 'cf1:id', 'cf1:price', 'cf1:user', 'cf1:timestamp'
现在,,
rowkey-仪器或任何对象
id-使用此标识哪个列具有最新数据。第一个条目的值为1,然后继续
用户-更新数据的用户
e、 g
起初,数据看起来像
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
现在假设行2或仪器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`
若您看到id更改为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 shell中提供帮助(也欢迎其他解决方案)
此外,如果架构师能够提出更好的解决方案来对表进行建模,以跟踪价格的变化/版本,我们也欢迎
谢谢。如果不进行大量管道输出并放大结果,在shell中很难做到这一点。shell输出格式也使这一点变得困难,因为它是如何分割行的。一个比编写Java更轻的解决方案是用ruby编写扫描仪。HBase附带jruby jar,允许您执行ruby脚本
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感谢您的回复。是的,我也同意使用Shell会很困难,但由于我现在为一个POC工作,所以我希望能够快速完成hte设计,而我对Java的知识非常有限,我正在考虑是否能够实现。这种方法看起来很适合开始研究。谢谢你的想法,我会努力的。