パーティション化は、データを分離してクエリを最適化する便利な方法を提供します。ただし、すべてのデータセットが適切なパーティションを形成できるわけではありません。テーブルまたはパーティションの場合、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のサンプル句の分母より大きくてはいけません