1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Athena】テーブルの中身をダウンタイムなしでデータを入れ替える

Posted at

テーブルデータを入れ替えたい!

Athena参照するデータはS3にあって柔軟にデータを入れ替えることが可能です。
不要になったデータは削除したり、新たに必要なデータを追加したりということが簡単に行なえます。2019年よりINSERT INTOも対応されたので、さらにデータの追加も簡単になりました。

データの入れ替え時に正しくない状態のデータが一時的に存在してしまう

例えば日付ごとのデータを管理していて、2022年4月1日のデータを削除して、新たにデータを入れるとします。
そうすると一時的に2022年4月1日のデータが空になってしまうことになります。この瞬間に他のユーザーがこのテーブルにアクセスすると、正しくないデータを取得してしまう可能性があります。

viewテーブルを活用

今回はhogeテーブルを利用していたとします。この中身をダウンタイム無しで入れ替えるにはhogeテーブルをviewテーブルとして起きます。viewの参照先はhoge_1とでもしておきます。hoge_view_1にはこれまでhogeテーブルが見ていたデータを入れておきます

create_view.sql
CREATE OR REPLACE VIEW hoge AS
SELECT * FROM hoge_1

こうしておけばhogeテーブルはこれまで通り

select.sql
SELECT * FROM hoge

のようにデータを取得できます。このhogeテーブルの中身を入れ替えたいとなったら先にデータを修正したhoge_2を作っておきます。
それを再度viewで作り変えます

create_view.sql
CREATE OR REPLACE VIEW hoge AS
SELECT * FROM hoge_2

こうすることで常にhogeテーブルは参照できつつ、データの入れ替えが可能になりました。一時的にS3に存在するデータは倍になるのであまりにもデータが巨大だと難しいかもしれません。

スキャン量の心配はなし(要検証)

Athenaはviewやサブクエリを利用しても最終的に必要になる分だけのデータしかスキャンしないようになっているようです

select_limit.sql
SELECT * FROM hoge limit 100

として場合、hogeテーブルはviewなのでhoge_1を全件スキャンしたあとに100件だけ取得するような動きに見えるかもしれませんが、実際にはhoge_1から100件のみスキャンしてくれるみたいで、不要なスキャンが増える心配もなさそうです。
ただ様々なパターンで検証はしていないので、特定の場合にはviewを利用したことによりスキャンが増えるかもしれないのでそのへんはご検証ください

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?