見出し画像

【AWS】 S3 × Glue × AthenaでJSONをクエリしてみた|1日1ハンズオン Day 49

こんにちは、ぽめら です。
本記事は1日1ハンズオン企画、第49回です!

今回は過去回の振り返りをしつつ、S3にアップしたJSONをAthenaでクエリしてみたいと思います📊



1.はじめに

過去回でJSONの作成〜S3アップロードまでは実施していました。

また、CSVファイルのAthenaクエリも実施したことはあります。

今回はさらに“Glueも振り返りながら、S3内のJSONをAthenaでクエリする”をやってみたいと思います。

では、レッツハンズオン!


2.S3×Glue×AthenaでJSONをクエリしてみた

今回の主な流れは下記となります。

・S3バケットを準備
・S3にJSONをアップロード
・Glueでテーブル作成
・Athenaでクエリ


2-1.S3バケットを準備

今回のハンズオン用のS3バケットを用意します。

aws s3 mb s3://pomera-handson-day49
S3バケットの作成完了✌️

作成が終わったら念の為確認。

aws s3 ls

2-2.S3にJSONをアップロード

JSONデータをアップロードします。
JSONデータは前回作成したダミーファイル(user_data.json)を使用。

※ Glueを使用した段階でエラーにぶち当たったのでメモ✍️

AthenaとGlueにおいて、JSON Lines形式に変換しておくことが必要。Day48の形式はオブジェクト形式のためエラーになります。下記を参考にして脱出できました!!!😭感謝

・AWS Glueでオブジェクトの配列があるJSONをフラット化する
https://dev.classmethod.jp/articles/glue-flatten-obj-array/

Glueでテーブル構造を認識するために、オブジェクト形式のJSONファイルから、JSON Lines形式に変換する必要があります。


今回はChatGPT先生にご登場いただきサクッと変換ファイルを作ってもらいました。(あくまで学習用なので品質改善は未来の自分に投げます)

▼変換用Pythonファイル(例)

# -------------------------------
# JSON配列 → JSON Lines 変換スクリプト
# -------------------------------
import json
import argparse
from pathlib import Path


def convert_to_json_lines(input_file, output_file):
    """配列型JSONをJSON Lines形式に変換"""
    # 入力ファイルを読み込み
    with open(input_file, "r", encoding="utf-8") as f:
        data = json.load(f)

    # 出力ファイルに1行ずつ書き出し
    with open(output_file, "w", encoding="utf-8") as f:
        for record in data:
            f.write(json.dumps(record, ensure_ascii=False) + "\n")

    print(f"✅ JSON Lines 形式に変換しました:{output_file}")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="Convert JSON array file to JSON Lines format."
    )
    parser.add_argument(
        "--input",
        default="user_data.json",
        help="変換対象のJSONファイル名(デフォルト: user_data.json)",
    )
    parser.add_argument(
        "--output",
        default="user_data_lines.json",
        help="出力するJSON Linesファイル名(デフォルト: user_data_lines.json)",
    )

    args = parser.parse_args()

    input_path = Path(args.input)
    output_path = Path(args.output)

    if not input_path.exists():
        print(f"❌ 入力ファイルが見つかりません:{input_path}")
    else:
        convert_to_json_lines(input_path, output_path)

▼変換前(オブジェクト形式)

[
  {
    "id": 1,
    "name": "藤井",
    "score": 32,
    "timestamp": "2025-10-18T16:33:23.295065"
  },
  {
    "id": 2,
    "name": "佐々木",
    "score": 98,
    "timestamp": "2025-10-18T16:33:23.295092"
  }
.
.
.
]

▼変換後(JSON Lines形式)

{"id": 1, "name": "藤井", "score": 32, "timestamp": "2025-10-18T16:33:23.295065"}
{"id": 2, "name": "佐々木", "score": 98, "timestamp": "2025-10-18T16:33:23.295092"}

上記で用意したuser_data_lines.json のあるディレクトで下記を実行。

aws s3 cp user_data_lines.json s3://pomera-handson-day49/input/

※ Pythonでアップロードするプログラムも作成していましたが、今回はクエリすることがメインのため直接アップしちゃいます😇

確認:

aws s3 ls s3://pomera-handson-day49/input/

2-3.Glueでテーブル作成

過去回を思い出しながらテーブル作成をGlueさんにお願いします。

① Glue コンソール を開く
② 左メニュー「データカタログ」 →「 Crawler」をクリック

③ 「Crawlerの追加」をクリック

④ 各種設定

Crawler名:pomera_day49_crawler
データソース:S3
S3パス:s3://pomera-handson-day49/input/
IAMロール:AWSGlueServiceRole-Default(既存または新規作成)
出力データベース:pomera_day49(新規作成)

※ 詳細は過去回参照

⑤ 「create crawler」をクリック
⑥ 「Run crawler」をクリック
⑦ "Conpleted"を見届ける😇

Table作成完了!

2-4.Athenaでクエリ

テーブルができたのであとはクエリするだけ。

① Athena クエリエディタを開く
② データベースを選択し、テーブルが作成されているか確認

③ クエリしてみる

100件あることを確認
平均値も出してみた

以上です!


3.まとめ

今回は過去回で作成したJSONファイルをS3に格納し、Glue Crawlerでテーブルを作成したのち、Athenaでクエリしてみました。

・Glue 、Athena でJSONを扱う際の注意点
👉 オブジェクト形式ではなく、JSON Lines形式にすること

Glue と Athena でJSONの形式に使用できないものがあるという点は盲点でした…。やはりやってみないとわからないこともあるものですね😇

というわけで今日はここまで!
ではまた明日👋


4.参考リンク

・AWS Glueでオブジェクトの配列があるJSONをフラット化する|DevelopersIO

いいなと思ったら応援しよう!