0

製品(時系列)の価格と在庫をデータベースに保存します。私の行キーは次の構造を持っています:

productid-タイムスタンプ

家族の在庫、価格などで。

スキャンで複数の製品 ID を取得することは可能ですか?

例: product-id 4711、4744、8485、8585 からのすべてのデータを提供してください。

よろしくケビン

4

2 に答える 2

0

HBase には、GET と SCAN という 2 つの基本的な取得オプションがあります。SCAN とは、行 N から開始し、行 M (M >= N) に到達するまですべてのレコードを順番に返すことを意味します。GET は単なる単一行スキャン (M==N) です。実際、それは実際にはそのように実装されており、行がソートされているため理にかなっています。そのため、それらの 1 つに到達するための根本的に効率的な方法はありません。

したがって、あなたの場合、いくつかのオプションがあります。

  1. 1 回の GET 呼び出しでそれぞれを取得できますが、毎回 RPC オーバーヘッドが発生します。
  2. 単一のバッチ呼び出しでそれらの多くを取得できます。これにより、1 つの RPC のみが発生します (行が複数のリージョンにまたがっている場合はリージョンごとに、大量に取得している場合はバッチ サイズによって制限されます)。これは、あなたのケースの#1に対する明確な勝利です。
  3. 行が行キーの小さなスペースにクラスター化されている場合は、手動でそれらを複数のスキャンにまとめて並行して実行し、クライアント側でポストフィルタリングを実行して、必要なものだけを返すことができます (この場合、 4711->4744、および 8485->8585 からスキャンできます)。これを正しく行うにはさらに多くのスマートが必要ですが、テーブルのまばらさや密度、行サイズなどに応じて、いくつかの純粋なパフォーマンス シナリオで勝つ可能性があります。
  4. SEEK_NEXT_USING_HINTでカスタム フィルターを使用して、このような場合に raw スキャン時間を節約できます。目的の ID の 1 つのクラスターの最後を通過したことを確認したら、次のクラスターにジャンプする「スキップ スキャン」を実行します。 . 繰り返しますが、テーブルの特性によっては、これで勝てる場合とそうでない場合があります。

もう 1 つの優れたオプションもあります。HBase 上の SQL スキンであるPhoenixを使用することもできます。まさにこの場合のためにスキップ スキャンが既に組み込まれており、JDBC ドライバーとして公開されています。また、ゼロから作成するのは骨の折れるパフォーマンスの最適化が他にもたくさんあります (集計コプロセッサなど)。

(完全な開示、私はフェニックスを作成した会社で働いていますが、それは完全にオープンソースであるため、それがクールだと思うことを除いて、それを提案することに特別な既得権はありません. :)

于 2013-06-16T20:16:59.387 に答える