Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop HBase外壳-检索(仅)列值(而不是列名)_Hadoop_Hbase - Fatal编程技术网

Hadoop 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-使用此标识哪个列具有最新数

我是Hadoop和HBase的新手,尝试学习和评估它是否可以用于我的用例。作为Java新手(我基本上是Perl/Unix和DB开发者),如果可能的话,我会尝试在Hbase shell中获得解决方案

我有一个HBase表(下面的模式),我试图在其中实现历史数据(可用于审计和分析)

假设基本结构如下所示

    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的知识非常有限,我正在考虑是否能够实现。这种方法看起来很适合开始研究。谢谢你的想法,我会努力的。