12

Hbaseのドキュメントでは、物理的なストレージは列ファミリーによって行われるため、同様の列を列ファミリーにグループ化する必要があることが明確になっています。

しかし、列グループごとに別々のテーブルを持つのではなく、2つの列ファミリーを同じテーブルに配置することはどういう意味ですか?この方法でテーブルを「パーティション化」する方が理にかなっている特定のケースと、1つの「ワイド」テーブルがより適切に機能するケースはありますか?

個別のテーブルは個別の「行領域」になるはずです。これは、一部の列ファミリー(全体として)が非常にまばらな場合に役立ちます。逆に、列のファミリをまとめておくと有利なのはいつですか。

4

2 に答える 2

8

列ファミリーの概念は理解できました。基本的には、HBase がこれらの項目を一緒に格納してレプリケートし、アクセスを高速化するためのヒントにすぎません。

2 つの列ファミリを同じテーブルに配置し、それらにアクセスするためのキーが常に異なる場合、それらを 2 つの別々のテーブルに配置するのと同じことになります。同じキーを介してアクセスされる同じテーブルに 2 つの列ファミリを持つことによってのみ得られます。

たとえば、特定の Web サイトの合計ページビュー数、同じサイトのユニーク ビュー数、ユーザーがサイトを表示するために使用するブラウザー、およびインターネット接続の列がある場合、最初の 2 つは列ファミリーで、最後の 2 つは別の列ファミリーです。ここでは、4 つすべてが同じキー (問題の Web サイト) によってアクセスされるため、それらを同じテーブルに置くことで得をしています。

それらが異なるテーブルにある場合、2 つのテーブルに対して結合のような操作を行う必要があります。私は数字をよく知らないので、結合のような操作がどれほど遅いかを実際に伝えることはできません (HBase は非リレーショナルであるため、結合があったことを覚えていないため)。それらを別々のテーブルに配置することは、同じテーブルに配置することよりも重要です(またはその逆)。

もちろん、これはすべて保存しようとしているデータに依存するため、テーブル間で結合する必要がない場合は、それらを別々のテーブルに保持する必要があります。そもそも。

于 2009-04-15T18:22:53.760 に答える
8

列ファミリーは、行指向のアクセスと列指向のアクセスの間の妥協点です。Chris の Web ページの例を拡張すると、行アクセスは 1 つの Web サイトのすべてのデータ (列) をフェッチします。列指向の操作の例は、すべてのサイトのページ ビュー数を合計することです。

後者の操作では、ブラウザーと接続の詳細は必要ありません。これは、ビュー カウントの数値よりもはるかに大きく、クエリのパフォーマンスに大きな影響を与える可能性があります。したがって、HBase は、列操作をサポートする最適化として列ファミリーを提供します。

列を同じテーブルに配置するかどうかについては、通常のデータ モデリング ガイドラインに従って、同じエンティティの属性である場合はすべての列を同じテーブルに配置します。列ファミリーは、スキーマではなくパフォーマンスに関するものです。

于 2009-07-14T01:14:00.420 に答える