1

私の辞書には 100 万語の単語があります。ユーザーが私の Web サイトでクエリを発行するたびに、クエリに辞書の単語が含まれているかどうかを確認し、それらに対応するカウンターを個別にインクリメントします。たとえば、ユーザーが「オバマは大統領です」と入力し、「オバマ」と「大統領」が私の辞書にある場合、「オバマ」と「大統領」のカウンターを 1 増やす必要があります。

そして時々、上位 100 語 (最も検索された語) を見たいと思っています。Hbase を使用してカウンターを格納する場合、どのスキーマを使用すればよいですか? -- 効率的なものはまだ思いつきません。

辞書の単語を行キーとして使用し、「counter」を列キーとして使用すると、counter(increment) の更新が非常に効率的になります。しかし、トップ 100 を並べ替えて返すのは非常に困難です。

誰でも良いアドバイスを与えることができますか?ありがとう。

4

3 に答える 3

1

ナチュラル スキーマ (行キーを単語、列をカウント) を使用し、IHBase を使用してカウント列のセカンダリ インデックスを取得できます。初期実装については、https://issues.apache.org/jira/browse/HBASE-2037を参照してください。現在のコードはhttp://github.com/ykulbak/ihbaseにあります。

于 2010-06-04T04:43:12.063 に答える
0

HBaseCon 2012 での Adob​​e のプレゼンテーション(特にスライド 28) から、行キーに 2 つのテーブルとこの種のデータ構造を使用することをお勧めします。

名前

President => 1000
Test => 900

カウント

429461296:President => dummyvalue
429461396:Test => dummyvalue

2 番目のテーブルの行キーは、Long.MAX_VALUE (その時点でのカウント) を使用して導出されます。

新しい単語を取得したら、「count:word」を行キーとしてカウント テーブルに追加するだけです。そうすれば、テーブルをスキャンするときに常に上位の単語が最初に返されます。

于 2012-09-11T20:16:46.890 に答える
-1

1M long の並べ替えはメモリ内で実行できます。

時刻 t に発行された単語 x,y,z を key:t cols:word:x=1 word:y=1 word:z=1 としてテーブルに格納します。次に、MapRed ジョブを使用して単語数を合計し、上位 100 を取得します。

これにより、さらなる分析も可能になります。

于 2010-06-13T20:28:49.877 に答える