2

假设我创建了一个表

rowkey (attrId+attr_value) //复合键

列 => 文档:文档 1,文档:文档 2,...

当使用扫描功能时,我每次都会在迭代器中获取 1 行,如果列限定符达到数百万个条目怎么办。你如何循环,会有缓存问题吗?

谢谢。

4

3 回答 3

3

扫描获取行。您可以限定扫描,使其仅获取给定的限定符或给定的族,但这就是扫描返回的全部内容(您只能过滤扫描中包含的数据)。

如果您在一行中可能有数百万列,这可能是一个问题:这意味着返回该行可能是一个非常大的网络传输。如果您的行大小超过您的区域大小,它也可能导致您的区域服务器上出现 OOM 错误,并且您的存储效率将很低(每个区域一行)。

但是,忽略所有这些,您可以遍历客户端中的列和列限定符。您可以从结果集中获得一个映射,该映射从族到限定符到值。但这可能不是你真正想做的

于 2011-01-26T16:16:13.093 回答
3

您可以混合使用扫描和列过滤器来解决巨大的行提取问题:

Scan s = ...;
s.setStartRow("some-row-key");
s.setStopRow("some-row-key");
Filter f = new ColumnRangeFilter(Bytes.toBytes("doc0000"), true,
                                 Bytes.toBytes("doc0100"), false);
s.setFilter(f);

来源:http ://hadoop-hbase.blogspot.com/2012/01/hbase-intra-row-scanning.html

于 2012-05-31T16:47:08.090 回答
2

您还可以通过Scan.setBatch限制一次返回的行中的列数。

于 2012-06-05T19:46:21.550 回答