LoginSignup
22
17

More than 5 years have passed since last update.

AWS AthenaのPartitionに関して

Posted at

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 こいつを参考にして、いろいろチューニングする必要あり

22
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17