获取hbase中的所有家庭

时间:2011-05-01 13:36:28

标签: hbase

我有一个带

的hbase表
  

行:单词,家庭:日期

我想在日期'd'获取所有单词的扫描仪,我该怎么做?所以我不想指定行值。

3 个答案:

答案 0 :(得分:5)

您的问题并不清楚您要从哪里获取扫描仪,因此我会将其视为来自HBase命令行。我已经使用thrift库与hbase进行交互,并且CLI命令很明显地转换为了。我认为它们也可以很好地转换为你正在使用扫描仪的任何其他接口。

要获取特定列族的所有行,请使用以下命令

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

对于你的情况(减去'table_name''因为我不知道),它看起来像

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

这将返回列系列d中的所有行。

如果您还要指定要开始的RowKeys,它将类似于

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

该命令将从行键word开始,并在该点之后获取所有行。如果您想将其限制为RowKey word,则还需要添加STOPROWSTOPROW未包含在结果中。所以你不能执行scan 'yourTable', {COLUMNS => 'd:', STARTROW => 'word', STOPROW => 'word'},因为它不会返回任何内容。 指定STOPROW需要了解RowKey值。我不知道你的价值观,所以很难给出一个很好的例子。我经常做的是使用下一个字符(在ASCII集中)作为我的起始行的最后一个字符。在你的例子中,我试试

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

我不会保证这会一直有效,但在大多数情况下都可能有效。也许所有情况,我只是没有解决。 :)

希望这有帮助。

HBase shell命令的一个很好的资源是http://wiki.apache.org/hadoop/Hbase/Shell

答案 1 :(得分:0)

我假设您正在讨论使用Java API的scan命令

如果我正确理解了您的结构,那么您目前无法在没有全表扫描的情况下按日期检索单词。 - 你可以在扫描时setFilter但仍然必须到每行检查

您没有指定,但我猜每个单词都可以在很多日期出现(如果您的意思是每个日期都有一个家庭,那么请注意,建议不要超过2-3个家庭)

如果您想要一种相对有效的存储方式,我建议您将结构更改为 键Word0xDate并将日期存储在TimeStamp中,然后将一些1字节值存储为数据(以便存在一行) 存储方面它将与您当前的解决方案相同(加上2个字节,您可以通过缩短系列和限定符名称来抵消),并且您将能够扫描时间戳或一系列时间戳({{3因为hbase将跳过存储无关时间戳的文件,因此效率更高一些)

答案 2 :(得分:-1)

试试这个:

     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
           }
     }