S3に保存されたJSONのスキーマが変わった場合、Athenaクエリに調整が必要か試してみた

2024.06.25

はじめに

AthenaでS3に保存されたJSONに対してクエリを行っていました。
この時S3に保存されたJSONのスキーマが変わった場合、Athenaクエリの書き換え、またはテーブルの編集が必要なのか気になったので確認してみました。

通常のクエリ

まずは、以下のデータをS3に保存します。

{
    "deviceid": "abc123",
    "location": "osaka",
    "temperature": 26.3,
    "humidity": 60.1,
    "pressure": 23.2
}

次に、Athenaでテーブルを作成してクエリを実行します。
<テーブル作成クエリ>

CREATE EXTERNAL TABLE demo_db.my_table (
    deviceid STRING,
    location STRING,
    temperature DOUBLE,
    humidity DOUBLE,
    pressure DOUBLE
)
LOCATION 's3://<my-bucket-name>/'
TBLPROPERTIES ('has_encrypted_data'='false');

<クエリ>

SELECT * FROM "demo_db"."my_table";

<結果>

JSONデータの内容が表示されることが確認できました。

データを1つ削除する

次に、先ほどのデータから最後のデータを削除したデータをS3に登録してみます。

{
    "deviceid": "abc123",
    "location": "osaka",
    "temperature": 26.3,
    "humidity": 60.1
}

"pressure"という項目を削除しました。
イメージとしては

  • 削除した項目のみ空欄となる
  • エラーが出る

のどちらかだと思います。
それはテーブルは編集せずに先ほどと同じようにクエリを実行してみます。

削除した項目のみ空欄となる。でした。

データを1つ増やす

では次に、データを増やしてみましょう。
以下のデータをS3に保存します。

{
    "deviceid": "abc123",
    "location": "osaka",
    "temperature": 26.3,
    "humidity": 60.1
    "pressure": 23.2
    "power": 105.1
}

イメージとしては

  • 追加した項目は表示されない
  • エラーが出る

のどちらかだと思います。
それはテーブルはいじらずに先ほどと同じようにクエリを実行してみます。

追加した項目は表示されない。でした。
それでは追加した項目を表示するために、テーブルを更新するとどうなるかも試してみましょう。

まずは以下のクエリでテーブルにpowerのカラムを追加します。

ALTER TABLE demo_db.my_table
ADD COLUMNS (power DOUBLE);

<結果>

powerを追加したデータのみpowerの値が表示されていますね。

ちなみにカラムが不要になった場合でも、
カラムを削除するとスキーマが壊れるため、削除されたカラムがない状態のテーブルの再作成が必要になるようです。
そのため、カラムの削除は推奨されていないようです。

まとめ

スキーマが変わった場合はクエリ内容を変更することで柔軟にデータを表示することができました。
また、項目を追加した場合はテーブル更新+クエリ編集でデータを表示することが確認できました。