【Hive】Hive / HiveQL ~ パーティション / あれこれ編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/07/16/224332

の続き。

Hive の パーティション (Partition) にまつわるTipsをまとめておく

cf Partition = 仕切り壁、分割、分配

目次

【1】Partition 関連の設定プロパティ
 1)hive.exec.dynamic.partition
 2)hive.exec.dynamic.partition.mode
 3)hive.exec.max.dynamic.partitions
 4)hive.msck.path.validation
 5)spark.sql.sources.partitionOverwriteMode

【2】パーティションの値を知るには...
【3】パーティションの数を知るには...
【4】パーティションあたりの件数を知るには...

【1】Partition 関連の設定プロパティ

1)hive.exec.dynamic.partition
2)hive.exec.dynamic.partition.mode
3)hive.exec.max.dynamic.partitions
4)hive.msck.path.validation
5)spark.sql.sources.partitionOverwriteMode

1)hive.exec.dynamic.partition

* Dynamic Partition 機能 を活性・非活性にする
 => Dynamic Partition 機能とは、既存テーブルのカラムから自動的にパーティションを構成する機能

サンプル

hive.exec.dynamic.partition=true;

2)hive.exec.dynamic.partition.mode

* Dynamic Partition 機能のモード指定
# モード値 説明
1 strict デフォルト値。ユーザが誤って全てのPartitionを上書きした場合、少なくとも1つは静的なPartitionを指定しなければならない
2 nonstrict 全てのPartitionで動的に作成を許可する

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML

サンプル

# dynamic partition insert時、少なくとも1段のパーティションについては
# クエリ内で明示的に指定されていなければならない
SET hive.exec.dynamic.partition.mode=strict;

# パーティション指定用カラムをトップレベルからすべて動的に指定したい場合
SET hive.exec.dynamic.partition.mode=nonstrict;

https://tagomoris.hatenablog.com/entry/20141114/1415938647

3)hive.exec.max.dynamic.partitions

* 1回のdynamic partition insertsクエリで生成されるパーティション数の上限

サンプル

set hive.exec.max.dynamic.partitions=5000;

参考文献
https://tagomoris.hatenablog.com/entry/20141114/1415938647

4)hive.msck.path.validation

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

によると、
~~~
Hive1.3 から、もし、HDFS上でディレクトリに不正な文字をパーティションに使用している場合、
MSCKは例外を発生させる。
~~~

以下の関連記事も参照。

https://dk521123.hatenablog.com/entry/2020/05/28/175428

サンプル

# 不正なディレクトリをスキップする
set hive.msck.path.validation=skip;

# とりあえず、無視してパーティション作成を試みる(Hive1.3より前の振る舞い)
# (パーティションが正常に動作するかもしれないし、しないかもしれない)
set hive.msck.path.validation=ignore;

5)spark.sql.sources.partitionOverwriteMode

以下の関連記事を参照のこと

PySpark ~ パーティション単位で上書きするには ~
https://dk521123.hatenablog.com/entry/2021/07/07/093147

【2】パーティションの値を知るには...

SHOW PARTITIONS [db_name].[table_name];

【3】パーティションの数を知るには...

SELECT COUNT(DISTINCT (partition_key)) FROM [db_name].[table_name];

【4】パーティションあたりの件数を知るには...

SELECT partition_key, COUNT(*) FROM [db_name].[table_name] GROUP BY [partition_key];

補足:ざっくり容量を知りたい場合

外部参照テーブルでS3にファイルにアクセスができる際は、
直接AWSマネージメントコンソールからファイルの容量を直接参照すればいい。

関連記事

Hive / HiveQL ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2019/11/25/235219
Hive / HiveQL ~ パーティション / 基本編 ~
https://dk521123.hatenablog.com/entry/2020/07/16/224332
Hive / HiveQL ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2020/03/04/225943
Hive / HiveQL ~ 設定プロパティ ~
https://dk521123.hatenablog.com/entry/2020/09/19/152136
エラー「SemanticException Cartesian products are disabled for safety reasons」が発生する
https://dk521123.hatenablog.com/entry/2021/06/12/093046
AWS Glue上で エラー「Dynamic partition strict mode requires ...」が発生する
https://dk521123.hatenablog.com/entry/2021/05/17/120443
PySpark ~ パーティション単位で上書きするには ~
https://dk521123.hatenablog.com/entry/2021/07/07/093147