テーブルを作成したとしましょう
rowkey(attrId + attr_value)//複合キー
列=>doc:doc1、doc:doc2、..。
スキャン機能を使用すると、イテレータ内で毎回1行をフェッチしますが、列修飾子が数百万のエントリに達した場合はどうなりますか。どのようにそれをループしますか、そしてキャッシュの問題がありますか?
ありがとう。
フェッチ行をスキャンします。特定の修飾子または特定のファミリのみを取得するようにスキャンを修飾できますが、スキャンから返されるのはそれだけです (スキャンに含まれるデータのみをフィルタリングできます)。
1 つの行に数百万の列がある可能性がある場合、それは問題になる可能性があります。つまり、その行を返すと、ネットワーク転送が非常に大きくなる可能性があります。行サイズがリージョン サイズを超えると、リージョン サーバーで OOM エラーが発生する可能性もあり、ストレージが非効率になります (リージョンごとに 1 行)。
ただし、そのすべてを無視して、クライアントの列と列修飾子をループできます。ファミリから修飾子、値にマップする結果セットから Map を取得できます。しかし、それはおそらくあなたが本当にやりたいことではありません
スキャンと列フィルターを組み合わせて巨大な行フェッチを回避できます。
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
Scan.setBatchを使用して、一度に返される行内の列数を制限することもできます。