【发布时间】:2011-05-01 13:36:27
【问题描述】:
我有一个带有
的 hbase 表行:单词,家庭:日期
我想为日期“d”的所有单词获取扫描仪,我该怎么做?所以我不想指定行值。
【问题讨论】:
标签: hbase
我有一个带有
的 hbase 表行:单词,家庭:日期
我想为日期“d”的所有单词获取扫描仪,我该怎么做?所以我不想指定行值。
【问题讨论】:
标签: hbase
您的问题不清楚您要从哪里获取扫描仪,因此我将像从 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。
【讨论】:
我假设您正在谈论使用 Java API 的扫描命令
如果我正确理解您的结构,您目前无法在没有全表扫描的情况下按日期检索单词。 - 你可以在扫描时setFilter,但它仍然需要去每一行检查
您没有具体说明,但我猜每个词都可能出现在多个日期(如果您的意思是每个日期都有一个家庭,请注意不建议有超过 2-3 个家庭)
如果您想要一种相对有效的存储方式,我建议您将结构更改为 关键字 Word0xDate 并将日期存储在 TimeStamp 中,然后将一些 1 字节值存储为数据(以便存在一行) 存储方面,它将与您当前的解决方案相同(加上 2 个字节,您可以通过缩短系列和限定符名称来抵消)并且您将能够扫描时间戳或时间戳范围(setTimestamp和setTimeRange),这会更有效,因为 hbase 会跳过存储不相关时间戳的文件)
【讨论】:
试试这个:
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
}
}
【讨论】: