パーティション化されたテーブルが負荷を水平に分散するために使用されることは知っていますが、その正確な用途は何ですか? 誰でも簡単な例で説明できますか?
2 に答える
パーティショニングにより、Hive はすべてのデータを読み取ることなく、データのサブセットにアクセスできます。これが役立つ理由の具体的な例を次に示します。これを理解しやすくするために、私は説明を非常に還元しています。私が提供しようとしている表面レベル以上の理解が必要な場合は、他の場所で Hive パーティションを読むことをお勧めします。
タイム スタンプ付きデータを~1TB
1 日あたりの割合で受信しています。100 日前までさかのぼって合計データ ロードのデータがあり~100TB
ます。過去 10 日間のデータを集計したい場合がよくあります。100TB
パーティショニングを使用しない場合、 (WHERE 句にある) 日付のフィルターと一致しないため、データのほとんどが Hive によって無視されますが、すべてのデータを読み込む必要があります。日付で分割する場合、Hive はデータを日ごとのチャンクに分割します~1TBGB
。Hive は WHERE 句を見て、どのパーティションがフィルターを通過し、そのデータのみを処理するかを事前に判断します。この場合、私たちはただ見なければならないでしょう10TB
これにより、クラスター リソースの使用量が大幅に削減され、ジョブの完了時間が増加します。そして、合計で 1000 日分のデータが得られたとしても、残りのデータ1PB
を見るだけ10TB
で済みます。
実際には、多くの Hive クエリが、総データ ボリュームの明確に定義されたサブセットのみを気にすることは非常に一般的です。WHERE 句で範囲 (または単一の特定の値) を頻繁に指定する列について考えてみてください。複数の列に分割することもできます。たとえば、10 種類の可能な色を含む色の列があり、各色が 1 日あたり約 100 GB のデータを処理する場合、さらに色で分割することがあります。red
次に、過去 10 日間のデータのみを気にする場合は1TB
、データを処理するだけで済みます。
ただし、パーティショニングをやりすぎないように注意してください。私の日付の例から、日付によるパーティション分割が適切であれば、タイムスタンプによる秒単位でのパーティション分割の方が優れていると思われるかもしれません。これにより、理論的には、関心のある行だけを正確に取り込むことができます。ただし、これを行うと、パーティションが非常に小さくなり、Hive は非常に小さいファイルを適切に処理できなくなります。あまりにも多くの列でのパーティション化についても同じ懸念があります。注目すべきもう 1 つの点は、パーティション分割している列にデータがどの程度分散されているかです。データの 90% が color black
、9% が color red
、残りの 1% が他の 8 つの色に分割されている場合、大きなパーティションと小さなパーティションがいくつかあり、理想的ではありません。
パーティショニングには、基になるデータのファイル サイズを縮小するなど、他にもいくつかの利点があります。これは、テーブルをバックアップするファイルからその列を取り出し、その列の値をパーティションを保持するフォルダーに配置することによって実現されます。
あなたの質問を読むと、パーティション分割されたテーブルに関する回答を探しているように見えました。マネージド テーブルと外部テーブルは、まったく別の問題であり、独自の質問が必要です。
ハイブ管理テーブルはハイブによって完全に管理され、ハイブは独自のデータ ウェアハウスにテーブル (データ ソース) のコピーを作成し、ハイブを削除するときに、このファイルをウェアハウスから削除する責任があります。管理テーブルのカウンターでは、外部テーブルを直接テーブルの作成時に External キーワードを使用してハイブによって作成され、ウェアハウス内のデータはコピーされません。テーブルのドロップ中、データはそのまま残ります。