ハイブエントリバケットテーブル

パーティション化は、データを分離してクエリを最適化する便利な方法を提供します。ただし、すべてのデータセットが適切なパーティションを形成できるわけではありません。テーブルまたはパーティションの場合、Hiveはバケットにさらに編成できます。これは、より細かいデータ範囲の分割です。
バケット化は、データセットをより管理しやすい部分に分割するもう1つの手法です。
パーティション化はデータストレージパス用であり、バケット化はデータファイル用です。

バケットテーブルを作成する手順:

1.必須バケットを設定する

ファイルが小さすぎると、バケットテーブルが作成されてもバケットに入れられないため、要件に従ってバケットを強制的に分割し、デフォルトで削減するように削減を設定する必要があります。

set hive.enforce.bucketing=true;
set mapreduce.job.reduces=-1;

2.バケットテーブルを作成する

create table stu_buck(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';

上記はフィールドIDに応じたバケット化であり、バケットの数は4です。
ここに画像の説明を挿入

3.バケットテーブルにデータを追加する

バケット化の条件は、テーブルの作成時にクラスター化された背後のフィールドに基づくハッシュ計算であるため、データを追加するときにmapreduceプログラムを使用する必要があり、通常のロード方法はバケット化できません。

  • バケットに関係なく、同様のテーブルを作成します。
create table stu(id int, name string)
row format delimited fields terminated by '\t';

ここに画像の説明を挿入

  • データをstuテーブルにアップロードします。
load data local inpath '/home/hive/student.txt' into table stu;

ここに画像の説明を挿入

  • サブクエリによってデータをバケットテーブルにインポートします。
insert into table stu_buck select id, name from stu;

ここに画像の説明を挿入ここに画像の説明を挿入

4.バケットサンプリングクエリ

非常に大きなデータセットの場合、ユーザーがすべての結果ではなく、代表的なクエリ結果を使用する必要がある場合があります。Hiveは、テーブルをサンプリングすることでこの要求に応えることができます。
テーブルstu_buckのデータをクエリします。

select * from stu_buck tablesample(bucket 1 out of 4 on id);

注:tablesampleは、サンプリングステートメント、構文:TABLESAMPLE(BUCKET x OUT OF y)です。
yは、テーブル内のバケットの総数の倍数または係数でなければなりません。Hiveは、yのサイズに従ってサンプリング率を決定します。たとえば、テーブルは4つの部分に分かれており、y = 2の場合は2バケットのデータが抽出され(4/2 =)、y = 8の場合は1/2バケットのデータが抽出されます(4/8 =)。
xは、抽出を開始するバケットを示します。複数のパーティションを取得する必要がある場合、後続のパーティション番号は、現在のパーティション番号にyを加えたものになります。たとえば、テーブルバケットの総数は4、tablesample(バケット2のうち1)です。つまり、合計(4/2 =)2バケットのデータが抽出され、1番目(x)と3番目(x + y)のバケットが抽出されます。データ。
注:xの値はyの値以下でなければなりません。それ以外の場合、
失敗しました:SemanticException [エラー10061]:分子は、テーブルstu_buckのサンプル句の分母より大きくてはいけません
ここに画像の説明を挿入

公開された39元の記事 ウォンの賞賛1 ビュー4620

おすすめ

転載: blog.csdn.net/thetimelyrain/article/details/104170307