1.パーティション
1.作成する
create table 表名(
字段1 属性,...
)
partitioned by (字段名 属性) //注意这个分区中的字段名最好不要和表中的字段名相同
row format ...;
2.挿入
insert into 表名
partition(字段名="XXX")
select * from 其他表 where 条件;
厳密モード:where条件がないとテーブル全体を表示できません
严格模式查询:
select * from 表名 where 条件;
動的パーティション:ビジネスニーズまたはデータ移行を除いて、動的パーティション
セットmapred.mode = strict //厳密モード
セットmapred.mode = nonstrict //厳密モード
セットhive.exec.dynamic.partition = trueを閉じることはお勧めしません。;
set hive.exec.dynamic.partition.mode = nonstrict;
setyarn.scheduler.minimum-allocation-mb = 3072; //仮想メモリをヤーン、デフォルトは1024
set hive.exec.max.dynamic.partitions.pernode = 2000; //パーティションの数を設定します。デフォルトは100です。
第二に、バケツ
1バケット-> 1リデュースは
、ハッシュコードの残りを取得することにより、MRのパーティションと同等です。
设置分桶:
set hive.enforce.bucketing=true;
设置reduce数:
set.mapred.reduce.tasks=分桶的个数
上传文件的方式,分桶失效
只能用insert into插入数据
1.作成する
create table 表名(字段1 属性...)
clustered by (trade_account_id) into 8 buckets //分桶关键
row format...;
2.挿入
insert into 表名
select * from 其他表;
3.ランダムサンプリング
select * from cust_detail_bucket tablesample(bucket 1 out of 8 on rand())s; //通常は
select * from cust_detail_bucket tablesample(bucket 1 out of 8 on trade_account_id)s; //通常はこれを使用します
第三に、パーティショニングとバケット化の違い
それらの目的:クエリ効率とデータスキューの問題を解決する
ハイブパーティション:
Hiveパーティションは、HDFSのサブディレクトリ機能を使用して実装されます。各サブディレクトリには、パーティションに対応する列名と各列の値が含まれています。ただし、HDFSは多数のサブディレクトリをサポートしていないため、これによってパーティションの使用も制限されます。パーティションの数が多すぎることによって引き起こされる一連の問題を回避するために、テーブル内のパーティションの数を見積もる必要があります。
Hiveクエリは通常、クエリ条件としてパーティション化された列を使用します。このようにして、MapReduceタスクがHDFSの指定されたサブディレクトリでスキャンを完了するように指定できます。HDFSのファイルディレクトリ構造は、インデックスと同じくらい効率的に使用できます。
なぜバケツをしたいのですか?
パーティションの数が多すぎてファイルシステムがクラッシュする可能性がある場合は、バケットを使用して問題を解決する必要があります。
パーティション内のデータはさらにバケットに分割できます。列を直接分割するパーティションとは異なり、バケットは多くの場合、列のハッシュ値を使用してデータを分割し、別のバケットに分散してデータバケット化プロセスを完了します。
Hiveは、バケットで使用されている値のハッシュを使用し、ハッシュ結果をバケット数で除算して、バケットを除算する余り演算を実行します。これにより、各バケットにデータが存在するようになりますが、各バケットのデータ数は次のようになります。等しくてはいけません。
ハッシュ関数の選択は、バケット操作の対象となる列のデータ型によって異なります。データのサンプリングに加えて、バケット操作を使用して、効率的なマップ側の接続操作を実装することもできます。
データ量が十分に多い場合は、パーティショニングよりもバケット化の方が効率的です。