我有一个带
的hbase表行:单词,家庭:日期
我想在日期'd'获取所有单词的扫描仪,我该怎么做?所以我不想指定行值。
答案 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
,则还需要添加STOPROW
。 STOPROW
未包含在结果中。所以你不能执行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
}
}