データ・ウェアハウス(8)---hiveのパフォーマンス最適化---hive動的パーティション


前回の記事では、パーティション化、手動パーティション化の方法について学習しました.データ・ウェアハウス(7)—hiveのパフォーマンス最適化—hiveのパーティションとバケツは、パーティション化後にデータを挿入する場合、自動的にパーティション化されるのではなく、再び手動でパーティション化する必要があります.リレーショナル・データベース(Oracleなど)では、パーティション・テーブルのInsertデータの場合、データベースはパーティション・フィールドの値に基づいて、対応するパーティションに自動的にデータを挿入します.Hiveでは、ダイナミック・パーティション(Dynamic Partition)という同様のメカニズムが用意されていますが、Hiveのダイナミック・パーティションを使用するには、対応する構成が必要です.

パーティションの種類


パーティションは、静的パーティションstatic partition動的パーティションdynamic partition静的パーティションと動的パーティションの2つに分けられます.違いは、データのインポート時にパーティション名を手動で入力するか、データでデータパーティションを判断するかです.ビッグデータの一括インポートでは、ダイナミックパーティションの採用がより簡単で便利であることは明らかです.

ダイナミックパーティション構成方法


hiveのデフォルト設定を変更して、ダイナミックパーティションをサポートします.
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

その他のパラメータ


hive.exec.dynamic.partitionデフォルト:falseがダイナミックパーティション機能をオンにするかどうか、デフォルトfalseがオフになります.ダイナミックパーティションを使用する場合は、このパラメータをtrueに設定する必要があります.
hive.exec.dynamic.partition.modeデフォルト:strictダイナミックパーティションのモード、デフォルトstrictは、少なくとも1つのパーティションを静的パーティションに指定する必要があることを示し、nonstrictモードは、すべてのパーティションフィールドでダイナミックパーティションを使用できることを示します.一般的にnonstrictに設定する必要があります
hive.exec.max.dynamic.partitions.pernodeデフォルト:100 MRを実行するノードごとに、最大何個のダイナミックパーティションを作成できますか.このパラメータは実際のデータに基づいて設定する必要がある.たとえば、ソースデータに1年間のデータが含まれています.すなわち、dayフィールドに365の値がある場合、このパラメータは365より大きく設定する必要があります.デフォルト値100を使用すると、エラーが表示されます.
hive.exec.max.dynamic.partitionsのデフォルト値:1000 MRを実行するすべてのノードで、最大で何個のダイナミックパーティションを作成できますか.上のパラメータで説明します.
hive.exec.max.created.filesデフォルト:MRジョブ全体で100000個の最大HDFSファイルを作成できます.一般的なデフォルト値は十分です.データ量が非常に大きい場合を除き、作成するファイル数が100000を超える場合は、実際の状況に応じて調整できます.
hive.error.on.empty.partitionデフォルト:falseが空のパーティション生成時に例外を放出するかどうか.一般的には設定は必要ありません.

≪インスタンス|Instance|emdw≫


静的パーティション


静的パーティションテーブルt_を新規作成student,元の情報テーブルt_student_info_25パーティションage=25に従ってパーティションを入れる、すなわち30以上の年齢層がある場合には30回以上類似のコマンドを実行する必要がある.
create table if not exists t_student(id int,name string,tel string) partitioned by(age int)
row format delimited fields terminated by ','
stored as textfile;

-overwriteは上書き、intoは追加
insert into table t_student
partition(age='25')
select id,name,tel,age from t_student_info_25;

ダイナミックパーティション


trueに設定と、ダイナミックパーティション機能(デフォルトはfalse)set hiveがオンになります.exec.dynamic.partition=true;
nonstrictに設定と、すべてのパーティションが動的(デフォルトはstrict)set hiveであることを示す.exec.dynamic.partition.mode=nonstrict;
Insert overwriteはカバー、insert intoは追加
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table t_student
partition(age)
select id,name,tel,age from t_student_info;

注意事項


元のテーブルからselectが出てくるフィールドの順序は、パーティション化テーブルの列と一致する必要があります.パーティション化されたテーブルは、パーティション化に使用されるフィールドを最後に置くため、直接select*でinsertを行うと、カラムが対応しなくなります.
クエリーされたデータ型と挿入テーブルに対応するカラムデータ型が一致しない場合、変換されますが、クエリーされたデータ型がintの場合、挿入テーブルに対応するカラム型がstringの場合、変換によってint型をstring型に変換できます.ただし、クエリーされたデータ型がstring、挿入テーブルに対応するカラム型がintの場合、アルファベットがintに変換できないため、変換に失敗したデータはNULLになる可能性があります.

静的パーティションと動的パーティションの混在


全てDP
INSERT OVERWRITE TABLE t_student PARTITION (time, age)  
SELECT id, name, time, age FROM t_student_info WHERE time is not null and age>10;  

DP/SP結合
INSERT OVERWRITE TABLE t_student PARTITION (time='2018-02-27', age)  
SELECT id, name, time,age FROM t_student_info WHERE time is not null and age>10;  

なお、SPがDPのサブパーティションである場合、以下のDMLは、パーティション順序がHDFSにおけるディレクトリの継承関係を決定するため、変更できない
INSERT OVERWRITE TABLE t_student PARTITION (time, age = 11)  
SELECT id, name, time,age FROM t_student_info WHERE time is not null and age=11;  

複数のテーブルの挿入
FROM student  
INSERT OVERWRITE TABLE t_student PARTITION (time='2018-02-27', age)  
SELECT id, name, time, age FROM t_student_info WHERE time is not null and age>10  
INSERT OVERWRITE TABLE t_student_12 PARTITION (time='2018-02-27, age=12)  
SELECT id, name, time, age from t_student_info where time is not null and age = 12;  

CTAS CREATE-AS文、DPはSPの下のCTAS構文と少し違います.ターゲットテーブルのschemaがselect文から完全に伝達されないためです.この場合create文にpartition列を指定する必要があります
CREATE TABLE t_student (id int, name string) PARTITIONED BY (time string, age int) AS  
SELECT id, name, time, age+1 age1 FROM t_student_info WHERE time is not null and age>10;  

DP下のCTASの使い方を示していますが、partition列に自分の定数を加えたい場合は、このようにすることができます.
CREATE TABLE t_student (id int, name string) PARTITIONED BY (time string, age int) AS  
SELECT id, name, "2018-02-27", age+1 age1 FROM t_student_info WHERE time is not null and age>10;  

まとめ


結果本章では,ダイナミックパーティションを使用するとテーブルを非常にスマートにロードでき,静的パーティション値がダイナミックパーティション値の前にあることに注意する必要があることを知ったはずである.