1. ホーム
  2. hadoop

[解決済み] Hiveでテーブルをパーティショニングすることとバケット化することの違いは何ですか?

2022-05-06 11:42:46

質問

両方がテーブルのカラムに対して実行されることは知っていますが、それぞれの操作はどのように違うのですか。

どのように解決するのですか?

パーティション分割 これはパフォーマンス上の利点があり、論理的な方法でデータを整理するのに役立ちます。 を扱っている場合、大きな employee テーブルを使用してクエリを実行することが多く、その際 WHERE 節を使用して、結果を特定の国や部署に制限することができます。より高速なクエリ応答を得るために、Hive テーブルは PARTITIONED BY (country STRING, DEPT STRING) . テーブルをパーティショニングすると、Hiveのデータストレージの構造が変わり、以下のようにパーティショニング構造を反映したサブディレクトリが作成されます。

.../employees/ country=ABC/DEPT=XYZ .

からの従業員に対するクエリ制限の場合 country=ABC の場合、1つのディレクトリの内容のみをスキャンします。 country=ABC . これは、クエリのパフォーマンスを劇的に向上させることができますが、パーティショニングスキームが一般的なフィルタリングを反映している場合に限られます。パーティショニング機能はHiveで非常に有用ですが、パーティションが多すぎる設計では、一部のクエリは最適化されても、他の重要なクエリでは不利になる可能性があります。また、パーティションが多すぎると、不必要に多くのHadoopファイルやディレクトリが作成され、ファイルシステムのすべてのメタデータをメモリ内に保持しなければならないため、NameNodeにオーバーヘッドが発生します。

バケット は、データセットをより管理しやすいパーツに分解するためのもう一つのテクニックです。例えば date をトップレベル・パーティションとし employee_id を第2レベルのパーティションとして使用すると、小さなパーティションが多くなりすぎてしまいます。その代わりに、従業員テーブルをバケット化して employee_id をバケット化カラムとして使用すると、このカラムの値がユーザー定義番号でハッシュ化されてバケット化される。同じ employee_id は常に同じバケツに格納される。の数を仮定すると employee_id がバケツの数よりはるかに多い場合、それぞれのバケツには多くの employee_id . テーブルを作成するときに、次のように指定することができます。 CLUSTERED BY (employee_id) INTO XX BUCKETS; ここで、XXはバケットの数です。バケット化にはいくつかの利点があります。バケット数は固定なので、データによって変動することがない。もし2つのテーブルが employee_id Hiveは論理的に正しいサンプリングを作成することができます。バケッティングはまた、効率的なマップサイド結合などを行う際にも役に立ちます。