はじめに
Athenaのテーブルの多くはパーティション化されています。パーティション化により、データのアクセス範囲が絞られて効率的にクエリが実行できます。
ただし、パーティション化した場合、パーティション設定でパーティションキーとパスを登録しないと指定したパーティションキーのデータはアクセスされません。
パーティション化した場合はパーティションキーも合わせて設定する必要があります。
Athenaテーブルのパーティション化
OptarcではApache Hiveスタイルのパーティションを設定しています。
store_mstテーブルをtenant_cdでパーティションする場合、tenant_cd毎のフォルダを作成し、その配下に実際のデータを置きます。
例: s3://s3バケット/store_mst/tenant_cd=100/
store_mstテーブルのフォルダ配下に販売日フォルダ持つ形でテーブルを作成すると、where句で「tenant_cd=100」 と指定すればこのフォルダ配下のみがアクセスの対象となります。
パーティション化したテーブルの作成
テーブルのパーティション化はcreate tableで定義します。
CREATE EXTERNAL TABLE store_mst(
store_cd varchar(6),
store_name varchar(60),
area_cd varchar(6),
close_div varchar(1),
upd_time timestamp)
PARTITIONED BY (
tenant_cd int
)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3://************/store_mst'
パーティションキーの設定
パーティションの設定は ALTER TABLEで実行できます。1回で複数のパーティションが設定できますが、1つのALTER TABLEで設定できるのは100パーティションまでです。
ALTER TABLE store_mst ADD
PARTITION (tenant_cd=100) location 's3://************/store_mst/tenant_cd=100/'
PARTITION (tenant_cd=200) location 's3://************/store_mst/tenant_cd=200/'
PARTITION (tenant_cd=300) location 's3://************/store_mst/tenant_cd=300/'
寂しいところ
ADD PARTITION は IF NOT EXISTS オプションが使用できますが、REPLACE の機能が有りません。
間違って登録されていると、消さない限りは間違ったパスが延々と残り続け、アクセス障害に気がつくことは難しいです。
間違ったパスはすぐに消したほうが幸せになります。
テストで適当なパスを指定して ADD PARTITIONするのもおすすめしません。
パーティションの削除
パーティションの削除も ALTER TABLE で実行できます。
ALTER TABLE store_mst DROP
PARTITION (tenant_cd=100)
PARTITION (tenant_cd=200)
PARTITION (tenant_cd=300)
寂しいところ
削除するパーティションを一つづつ指定する必要があります。
ALLで全部、とかができないので、いっぱいあるとうんざりします。
嬉しいけど寂しいところ
削除するパーティションを間違って無効なパーティションを指定した場合、テーブルの全パーティションが削除されます。
ラッキーと思いきや、これは「既知の問題」ということでGLUEの不具合らしいです。
間違って打つと、消す気がなくてもパーティションが全部消えちゃいます。
そうなると、一つづつALTER TABLE で設定する気も失せちゃいます。
ALTER TABLE 以外でのパーティション追加
ALTER TABLEを使用せずに一気にパーティションを作る方法もあります。
MSCK REPAIR TABLE コマンドを使えば、Hive形式のフォルダ構成なら自動的にパーティションを追加できます。
手作業であれば、このコマンドを実行するのが簡単です。
データが正しいパスで作成されていれば、パーティション全消し、MSCK REPAIR TABLE のセット実行がきれいなパーティションを作成するのには簡単です。
Athenaからテーブルを選んで「パーティションのロード」の選択で実行されるのもこのコマンドですね。
MSCK REPAIR TABLE store_mst
ところで
ADD PARTITION って、何のために有るの?と聞かれそうだけど、MSCKでできるのはHive形式のパーティションだけです。
ADD PARTITION使えば、好きなフォルダにパーティションをアサインすることができます。
パーティションキー設定の自動化
まだ使ったことはないので紹介だけ。
Athenaには「Parttion Projection」という機能があって、これを使うと「Athenaの」パーティション設定が自動化できるようです。
説明を読んだところ、AthenaにPartition情報(定義)を登録しておくと、そこから自動的にパーティションキー(アクセスパス)を組み立ててくれます。
Glueとの関係、複雑で良く理解できてないけど Athenaのテーブル情報ってGlueのデータカタログを使ってて、パーティションもGlue側で管理されてます。
AthenaでALTER TABLEでパーティション足してもGlue側にちゃんと登録されています。
Athenaからクエリでパーティションが指定されたとき、Glueデータカタログからパーティション情報を取得するらしく、Partition Projectionを使うとGlueから取得せずに自分でPartitionを計算するので効率的です。
なので、Glueデータカタログでどんなパーティション設定が指定されててもAthenaマイワールドで自分で組み立てたパーティション情報でクエリが実行されるそうです。
使ってみたいけど「Athenaの機能」ってのが気になりますね。
仕事ではRedshift Spectrumを使ってて、そのデータをAthenaでクエリしたりすることが多いけど、Redshift SpectrumとPartition情報が共有できないと事故の元になりそうです。
Partition Projectionの設定がRedshift Spectrum でも使えるなら、Partition Projection使うのも良いと思います。
Partition Projectionの設定は create table のTABLEPROPERTIESで設定するので、テーブル定義だけで有効になるはずなので使いやすそうで興味津々です。
Comments