AWS AthenaのPartitionに関して


Athenaとは

S3上のデータに対して、SQLで集計を可能にしてくれるAWSのサービス

テーブル作成

S3のDirとColumnを指定し、テーブルを作成する

CREATE EXTERNAL TABLE IF NOT EXISTS <database_name>.<table_name> (
  `id` bigint,
  `year` int,
  `month` int,
  `day` int,
  `column` int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '\t',
  'field.delim' = '\t'
) LOCATION 's3://<my_bucket>/<path>/<to>/<data>'
TBLPROPERTIES ('has_encrypted_data'='false')

ただ、これだけだと検索するときに、全データを毎回スキャンしてしまい、データが蓄積するとQuery代がどんどん大きくなるので、検索範囲を絞れるようにするためにパーティションというものがある

パーティション

概要

パーティションは、データの検索範囲を指定するためのもの

テーブル作成

S3を指定してテーブル作成

  1. PARTITIONED BYのあとに、パーティションに使いたいcolumnを書く(複数のカラムをおけば、複数カラムでのパーティションも可能)
  2. パーティションに使ったカラムは、table定義からは除く
  3. 今回の場合は、s3://<my_bucket>/<path>/<to>/<data>/year=<year>/month=<month>/day=<day>以下に実際のデータファイルが存在し、そのファイルがtsv形式で、idcolumnをカラムに持っている必要がある
  4. パーティションの順番には特に意味はないようで、今回の例で query上でmonthだけを指定して検索することも可能
CREATE EXTERNAL TABLE IF NOT EXISTS <database_name>.<table_name> (
  `id` bigint,
  `column` int
)
PARTITIONED BY (year int, month int, day int)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '\t',
  'field.delim' = '\t'
) LOCATION 's3://<my_bucket>/<path>/<to>/<data>'
TBLPROPERTIES ('has_encrypted_data'='false')

CREATE TABLEだけでは、ダメなので、登録する

MSCK REPAIR TABLE <table_name>

あとから増えたS3パスに対してパーティションを追加する

ALTER TABLE <athena_database>.<athena_table> ADD IF NOT EXISTS PARTITION (year=2019, month=02, day=01)

あとからパーティションを削除する

一つパーティションを消す

ALTER TABLE <athena_database>.<athena_table> DROP IF EXISTS PARTITION (year=2019, month=02, day=01)

複数同時に消す

今回の例では、2019年2月のパーティションはすべて消す(1日~28日)

ALTER TABLE <athena_database>.<athena_table> DROP IF EXISTS PARTITION (year=2019, month=02)

パーティションがなくてデータだけがあると

パーティション指定したときに、パーティションリストから対応するDirリストをみてデータを見に行くので、パーティションがない場合には、検索対象に入らない模様。

パーティションが増えすぎると

パーティションが増えすぎると検索のたびに全てのパーティションリストをロードして対応するパーティションのパスリストからデータを見に行くので、オーバーヘッドが大きくなるため、検索が遅くなる

https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/#OptimizeFileSizes こいつを参考にして、いろいろチューニングする必要あり