結論

AWS Glue は、S3 などにあるデータの「表の定義(Data Catalog)」を作り、変換して書き出す処理(ETL ジョブ)をサーバーを持たずに動かせる AWS のデータ統合サービスです。料金は動いた時間 × DPU(処理能力の単位)で決まり、公式の料金例では 6 DPU で15分のジョブが 0.66 USD です。

この記事でわかること

  • Glue の部品(Data Catalog・クローラー・ETL ジョブ・Glue Studio・Data Quality)の役割と Athena との関係
  • DPU 時間・最低課金・Glue 6.0 の値下げを入れた月の料金を Python で試算した表
  • Glue のジョブと同じ変換を pandas で動かし、Parquet の分割・表の定義・品質チェックまで確かめた結果

2026年11月13日更新|Python 3.13・pandas 3.0・pyarrow 26・DuckDB 2.0 で実行確認(AWS には接続していません)

この記事で実際に動かしたもの:公式の単価を使った料金の試算、Glue のジョブと同じ変換(CSV → 重複・欠損の除去 → 日付で分割した Parquet)、クローラーが登録する表の定義の組み立て、Athena の代わりに DuckDB で分割を絞り込む SQL、データ品質ルールの判定、よく出るエラーの再現です。

flowchart TD
    S[S3 の生データ CSV] --> C[クローラー<br>スキーマを推定]
    C --> D[(Data Catalog<br>表の定義)]
    D --> J[ETL ジョブ<br>Spark・Python シェル]
    J --> P[S3 の Parquet<br>日付で分割]
    P --> C2[クローラー再実行<br>パーティション登録]
    C2 --> D
    D --> A[Athena で SQL]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
AWS Glue とは サーバーレスのデータ統合サービス。表の定義を管理し、ETL を動かす AWS Glueとは
Glue でできること カタログ・クローラー・ETL ジョブ・ノーコードの作成画面・品質チェック・ワークフロー AWS Glueの部品とできること
AWS Glue の料金 DPU 時間あたり 0.44 USD(料金ページの基本の表示)。秒単位、ジョブは最低1分 AWS Glueの料金(DPU)
月にいくらかかるか 毎日 10 DPU で15分なら月 33.00 USD(Glue 6.0 の30%引きなら 23.10 USD) 料金をPythonで試算
クローラーとは データを読んでスキーマを推定し、カタログに表を作るプログラム。最低10分の課金 クローラーの仕組み
ETL ジョブの書き方 PySpark(GlueContext と DynamicFrame)か Python シェル(pandas) ETLジョブのスクリプトの形
Athena との違い Athena は SQL を投げる側、Glue は表の定義と変換を受け持つ側 AthenaとAWS Glueの関係
Glue を使わない方がよい場面 数秒で終わる小さな処理を高い頻度で回すときは、最低課金が効く 判断表

確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18・pandas 3.0.5・pyarrow 26.0.1・DuckDB 2.0.0 を使い、自作した注文データ(CSV 3ファイル・30,066行)で、Glue の ETL ジョブと同じ変換、Hive 形式(key=value)のフォルダーに分けた Parquet の書き出し、クローラーが登録する表の定義(CreateTable の TableInput の形)の組み立て、DuckDB での分割の絞り込み、DQDL の形をまねたルールの判定を実行しました。料金は AWS Glue の料金ページ・よくある質問の単価と最低課金をもとに Python で計算しています。この環境では AWS に接続しておらず、Glue のジョブ・クローラー・コンソールは動かしていません。Glue 用の PySpark のスクリプトと Python シェルのスクリプトは構文の確認(py_compile)だけを行い、API の名前は AWS Glue デベロッパーガイドで確かめました。部品の定義・版・ワーカーの種類・上限は docs.aws.amazon.com、料金は aws.amazon.com の料金ページ・よくある質問・新機能のお知らせ・AWS 公式ブログで確かめています(確認日 2026年11月13日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS Glueとは|できること・料金(DPU)とクローラー・ETLの始め方」

AWS Glueとは(サーバーレスのデータ統合サービス)

この節では、AWS Glue が何をするサービスで、ETL のどこを受け持つのかが分かります。

AWS Glue は、データの場所と形を記録する「カタログ」と、データを取り出して(Extract)、変換し(Transform)、書き出す(Load)処理を、サーバーの用意なしで動かす仕組みをまとめたサービスです。 公式の用語集では、Data Catalog を「AWS Glue の永続的なメタデータの保存場所」と説明し、表の定義・ジョブの定義などを持つとしています。Data Catalog は AWS アカウントごと・リージョンごとに1つです。

ETL は、ばらばらの形で届いたデータを、分析しやすい形にそろえる作業です。たとえば、店舗ごとに毎日届く CSV の列名をそろえ、金額を数値に直し、重複を消し、日付ごとのフォルダーに Parquet(列ごとに圧縮して保存する形式)で置き直す、という流れです。Glue はこの「そろえる処理」と、そろえたデータを SQL で読めるようにする「表の定義」の両方を受け持ちます。

Glue が受け持つこと

表の定義(列・型・場所・パーティション)の管理

スキーマの推定と登録(クローラー)

変換処理の実行(Spark・Python シェル)

品質ルールの判定・処理の順番の管理

Glue の外にあるもの

データそのものの保存(S3・RDS など)

SQL を投げて結果を見る(Athena・Redshift Spectrum)

グラフや画面(QuickSight など)

それぞれの料金(S3 の保存料・Athena のスキャン料)

表の定義とデータは別の場所にあります。 公式の用語集は、テーブルを「データを表すメタデータの定義」とし、「実際のデータは元のデータストアに残る」と書いています。Glue の表を消しても S3 のファイルは消えず、逆に S3 のファイルを消しても表の定義は残ります。この切り分けを最初に押さえると、後の料金やつまずきが読みやすくなります。

AWS Glueの部品とできること(Data Catalog・クローラー・ETLジョブ)

この節では、AWS Glue を構成する部品の名前と、それぞれで何ができるのかが分かります。

Glue は1つの製品ではなく、カタログ・クローラー・ジョブ・作成画面・品質チェック・ワークフローの部品の集まりです。 必要な部品だけを使えます。たとえば、表の定義は Athena の CREATE TABLE で書き、変換だけ Glue のジョブで行う、という組み合わせもできます。

1

Data Catalog

データベースとテーブル(列・型・場所・パーティション)を記録する。Athena・EMR・Redshift Spectrum から参照される。

100万オブジェクトまで無料

2

クローラー

S3 や JDBC の接続先を読み、分類子(classifier)で形式とスキーマを推定してテーブルを作る。

最低10分の課金

3

ETL ジョブ

変換のスクリプト・入力・出力の組。Spark(バッチ・ストリーミング)・Ray・Python シェルの種類がある。

秒単位・最低1分

4

Glue Studio

画面上で入力・変換・出力の箱をつないでジョブを作り、PySpark のスクリプトを生成する。ノートブックでの開発もできる。

ノートブックはセッション課金

5

Data Quality

DQDL という書き方でルール(欠損なし・一意・値の範囲など)を決め、テーブルやジョブの途中で判定する。

最低2 DPU・1分

6

トリガー・ワークフロー

時刻や前の処理の終了を合図に、クローラーとジョブを順番に動かす。

スケジュール・イベント

公式の用語集のうち、最初に覚えると読みやすくなる言葉を表にしました(定義は AWS Glue デベロッパーガイドの「AWS Glue の概念」による)。

用語 公式の定義の要点 この記事の例でいうと
データベース 関連するテーブルの定義をまとめた論理的なまとまり sales_raw・sales
テーブル データを表すメタデータの定義。列名・型・パーティションなど orders(5列+year・month・day)
分類子(classifier) データのスキーマを決める。CSV・JSON・Avro・XML などを用意 CSV と Parquet
接続(connection) 特定のデータストアにつなぐためのプロパティを持つカタログのオブジェクト RDS・JDBC を読むとき
DynamicFrame 入れ子を扱える分散テーブル。各レコードがスキーマを持つ。Spark の DataFrame と相互に変換できる ジョブの中のデータ
ワーカー・DPU 1 DPU は 4 vCPU・16GB メモリの処理能力。ジョブの料金の単位 G.1X は 1 DPU

AWS Glueの料金(DPU時間・最低課金・無料枠)

この節では、AWS Glue の料金がどう決まるのかと、料金ページに出ている単価・最低課金・無料枠が分かります。

Glue の料金は「使った DPU の数 × 動いた時間 × DPU 時間の単価」です。 料金ページの日本語版は「1 DPU-時間あたりの料金は 0.44 USD です」と書き、秒単位で課金すると説明しています。料金はリージョンによって異なり、確認日に取得した料金ページの文面ではリージョン名が示されていなかったため、東京リージョンの単価は料金ページでリージョンを選んで確かめる必要があります。

0.44USD1 DPU 時間の単価料金ページの基本の表示
1分ETL ジョブの最低課金よくある質問の記載
10分クローラーの最低課金よくある質問の記載
課金されるもの 単価(2026年11月13日時点) 最低課金・無料枠 出典
ETL ジョブ(Spark・Python シェル) 0.44 USD/DPU 時間 秒単位・最低1分 料金ページ・よくある質問
Flex 実行クラス(Spark のみ) 料金例では 0.29 USD/DPU 時間 開始や終了の時刻がずれてよいジョブ向け 料金ページの料金例
インタラクティブセッション 0.44 USD/DPU 時間(既定 5 DPU) 料金ページに最低の記載なし 料金ページ
クローラー 0.44 USD/DPU 時間 最低10分 料金ページ・よくある質問
Data Catalog の保存 100万を超えた分、10万オブジェクトごとに月1.00 USD 100万オブジェクトまで無料 料金ページ
Data Catalog へのアクセス 料金例では100万回を超えた100万回で1 USD 100万回まで無料 料金ページ
Data Quality のタスク 0.44 USD/DPU 時間(料金例) 最低2 DPU・最低1分 料金ページ

カタログの「オブジェクト」は、テーブル・テーブルのバージョン・パーティション・パーティションのインデックス・統計・データベース・カタログです(料金ページの説明)。日付で細かく分けたテーブルは、パーティションの数だけオブジェクトが増えます。1テーブルを1日1パーティションで5年分持つと約1,826オブジェクトなので、1テーブルでは無料枠に届きませんが、時間単位の分割をたくさんのテーブルで持つと、100万に近づくことがあります。

Glue 6.0 の値下げ

AWS は2026年8月21日のお知らせで、Glue 6.0 で30%の値下げを発表しました。AWS 公式ブログ(2026年8月24日)は「Glue 6.0 で動かすジョブは、Glue 5.1 と比べて DPU 時間あたり30%安い」と説明しています。どちらの文面にも新しい単価の数字は書かれていないため、この記事では 0.44 USD の30%引きとして 0.308 USD で計算しました。実際に請求される単価は、料金ページでリージョンと版を選んで確かめます。

Glue の料金以外にかかるもの

  • S3 の保存とリクエスト:入力・出力・一時ファイル・スクリプトの置き場所。
  • Athena のスキャン料:作ったテーブルを Athena で読むと、Athena 側の料金がかかります(Athena の文書は「AWS Glue には別に料金がかかる」と書いています)。
  • CloudWatch のログ:ジョブのログの保存。

請求の内訳は、関連記事「AWSの料金を確認する方法|Cost Explorer・CLI・予算アラート」で扱っています。Glue を試す前に予算アラートを作っておくと、ジョブの止め忘れに早く気づけます。

料金をPythonで試算(ジョブ・クローラー・カタログ)

この節では、公式の単価と最低課金をもとに、よくある使い方で月にいくらかかるのかを Python で計算した結果が分かります。

まず、計算式が公式の料金例と同じ答えになるかを確かめました。 料金ページの例(6 DPU で15分のジョブが 0.66 USD、2 DPU で30分のクローラーが 0.44 USD、5 DPU で24分のインタラクティブセッションが 0.88 USD、Flex で 6 DPU・20分が 0.58 USD)が、次の関数で4つとも一致しました。

import math
P = {"std": 0.44, "v6": round(0.44 * 0.7, 4), "flex": 0.29}

def job(dpu, sec, rate, min_sec=60):
    billed = max(sec, min_sec)          # ジョブは最低1分、クローラーは600秒を渡す
    return dpu * billed / 3600 * rate

print(round(job(6, 900, 0.44), 4))       # ETL 6DPU 15分
print(round(job(2, 1800, 0.44, 600), 4)) # クローラー 2DPU 30分
print(round(job(5, 1440, 0.44), 4))      # インタラクティブセッション
print(round(job(6, 1200, 0.29), 4))      # Flex 6DPU 20分
0.66
0.44
0.88
0.58

同じ関数で、よくある使い方を30日分計算しました。単価は 0.44 USD(料金ページの基本の表示)、0.308 USD(Glue 6.0 の30%引きを計算した値)、0.29 USD(料金例の Flex の単価)の3通りです。

使い方(30日) 0.44 USD 0.308 USD Flex 0.29 USD
A 毎日1回、G.1X×10(10 DPU)で15分 33.00 23.10 21.75
B 毎時1回、G.1X×2 で40秒(最低1分で請求) 10.56 7.39 6.96
C 毎日1回、G.2X×5(10 DPU)で1時間 132.00 92.40 87.00
D Python シェル 0.0625 DPU で毎日5分 0.07 ― ―

B の使い方では、最低1分の課金で実際の時間より5割高くなりました。 40秒のジョブを最低課金なしで計算すると 7.04 USD ですが、請求は 10.56 USD です。最低課金の効き方は次のとおりです。

== 最低1分の影響(2DPU・0.44)
  10秒: 請求 0.01467  実時間比 6.0倍
  30秒: 請求 0.01467  実時間比 2.0倍
  60秒: 請求 0.01467  実時間比 1.0倍
 120秒: 請求 0.02933  実時間比 1.0倍
 300秒: 請求 0.07333  実時間比 1.0倍

クローラーは最低10分なので、短く終わるクローラーを毎日動かすと差が大きくなります。

クローラー(2 DPU・毎日・30日) 請求(最低10分) 実際の時間どおりなら
3分で終わる 4.40 USD 1.32 USD
10分で終わる 4.40 USD 4.40 USD
20分で終わる 8.80 USD 8.80 USD

1ワーカーを増やしても同額のことがある

G.1X×2 で60分、×4 で30分、×8 で15分は、どれも 0.880 USD。DPU 時間が同じなら料金は同じで、早く終わる方を選べる(処理が並列に分けられる場合)。

2短いジョブは最低1分が効く

10秒で終わる処理は実時間の6倍の請求になる。小さな処理をまとめて1回にすると、最低課金の重なりが減る。

3カタログは大きくなってから効く

5万オブジェクト・30万アクセスなら0円。150万オブジェクト・300万アクセスで月7 USD(保存5 USD+アクセス2 USD)と計算された。

Python シェルの最低課金は、確認日に取得した料金ページ・よくある質問・Python シェルの文書のいずれにも個別の記載が見つからなかったため、D は最低課金なしで計算しています。

クローラーの仕組みとパーティション(key=value)

この節では、クローラーが S3 のフォルダーからテーブルとパーティションを作る決まりと、カタログに登録される中身が分かります。

クローラーは、データストアにつなぎ、分類子を順に試してスキーマを決め、Data Catalog にテーブルを作るプログラムです(公式の用語集)。S3 のフォルダーが year=2026/month=11/day=10/ のように key=value の形(Hive 形式)なら、キーの名前がそのままパーティションの列名になり、そうでなければ partition_0・partition_1 のような名前になります(デベロッパーガイドの「パーティションの管理」)。

AWS のナレッジセンターは、クローラーがサブフォルダーとファイルから推定したスキーマを比べ、「スキーマが一致し、パーティションのしきい値が70%より高い」ときにパーティションとしてまとめ、一致しないときはフォルダーごとにテーブルを作る、と説明しています。

登録される表の定義を手元で組み立てた結果

次の節の ETL で書き出した Parquet のフォルダーを読み、クローラーが作るのと同じ種類の情報(列・型・パーティションのキー・場所・入出力の形式)を、Glue の CreateTable API が受け取る TableInput の形で組み立てました。型は Parquet のスキーマ(pyarrow で読んだ値)を Hive の型名に置き換えています。これはクローラーそのものではなく、クローラーが登録する中身を見えるようにした自作のスクリプトです。

import os, glob, json
import pyarrow.parquet as pq
T = {"int64": "bigint", "string": "string", "large_string": "string",
     "timestamp[ms]": "timestamp", "timestamp[us]": "timestamp", "double": "double"}
files = sorted(glob.glob("curated/**/*.parquet", recursive=True))
parts, cols = [], None
for f in files:
    rel = os.path.relpath(os.path.dirname(f), "curated")
    kv = [p.split("=", 1) for p in rel.split("/") if "=" in p]
    keys = [k for k, v in kv]; parts.append([v for k, v in kv])
    sch = pq.read_schema(f)
    c = [{"Name": n, "Type": T.get(str(t), str(t))}
         for n, t in zip(sch.names, sch.types) if n not in keys]
    if cols is None: cols = c
    elif c != cols: print("スキーマが違うファイル:", f)
{
  "Name": "orders",
  "TableType": "EXTERNAL_TABLE",
  "Parameters": { "classification": "parquet" },
  "PartitionKeys": [
    { "Name": "year", "Type": "string" },
    { "Name": "month", "Type": "string" },
    { "Name": "day", "Type": "string" }
  ],
  "StorageDescriptor": {
    "Columns": [
      { "Name": "order_id", "Type": "string" },
      { "Name": "order_date", "Type": "timestamp" },
      { "Name": "store", "Type": "string" },
      { "Name": "amount", "Type": "bigint" },
      { "Name": "status", "Type": "string" }
    ],
    "Location": "s3://example-bucket/curated/orders/",
    "InputFormat": "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat",
    "OutputFormat": "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat",
    "SerdeInfo": {
      "SerializationLibrary": "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe"
    }
  }
}
パーティション: [['2026', '11', '10'], ['2026', '11', '11'], ['2026', '11', '12']]
カタログのオブジェクト数の目安: データベース1 + テーブル1 + パーティション 3 = 5

パーティションのキーは文字列(string)として登録される形にしました。 後で SQL を書くときは day='11' のように引用符で比べます。同じフォルダーを DuckDB に読ませると、DuckDB は day を数値(BIGINT)と推定しました。道具によってパーティションの型の推定が違うので、表の定義の型を確かめてから WHERE を書くと迷いません。

クローラーがテーブルを分けてしまう原因

ナレッジセンターが挙げている「テーブルが複数できる」原因は次のとおりです。

  • ファイルの形式が混ざっている(CSV・Parquet・JSON)
  • 圧縮の種類が混ざっている(SNAPPY・gzip・bzip2)
  • スキーマが違う(あるファイルでは INT、別のファイルでは BOOL)
  • パスによってパーティションの構造がそろっていない
  • CSV に見出し行のあるファイルとないファイルが混ざっている

出力の設定には「S3 のパスごとに1つのスキーマを作る」働きの項目(S3 データのグループ化の動作)があり、データに互換性があればスキーマの近さを無視してまとめる、と説明されています。

ETLジョブのスクリプトの形(PySpark・Pythonシェル)

この節では、Glue の ETL ジョブの種類と、PySpark と Python シェルでのスクリプトの書き方が分かります。

Glue のジョブは「変換のスクリプト・入力・出力」の組で、種類は Spark(バッチとストリーミング)・Ray・Python シェルの3つです(版のサポート方針の文書)。多くの ETL は Spark のジョブで、少量のデータを pandas などで処理するなら Python シェルを選べます。

種類 中身 割り当て 向く処理
Spark(glueetl) PySpark・Scala。DynamicFrame を使える ワーカーの種類×数(最低2) 大きなデータの変換・結合
Spark ストリーミング(gluestreaming) Kinesis・Kafka などから続けて読む G.025X など 流れてくるデータ
Python シェル(pythonshell) Python 3.9。pandas・awswrangler などを最初から読み込める 0.0625 DPU か 1 DPU 少量のデータ・SQL の起動
Ray Python の分散処理(Glue 4.0 で Ray 2.4.0) Z.2X Python で書いた処理を並列に

PySpark のジョブ(Glue の Spark ジョブ)

次のスクリプトは、カタログの CSV のテーブルを読み、列名と型を変え、金額のカンマを取り、重複と店舗が空の行を消し、日付で分けた Parquet を書き出します。GlueContext・apply_mapping・write_dynamic_frame.from_options の partitionKeys は、デベロッパーガイドに載っている書き方です。この環境には Glue の実行環境がないため、構文の確認(py_compile)だけを行いました。

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ["JOB_NAME", "out_path"])
glueContext = GlueContext(SparkContext.getOrCreate())
job = Job(glueContext)
job.init(args["JOB_NAME"], args)

raw = glueContext.create_dynamic_frame.from_catalog(
    database="sales_raw", table_name="orders_csv",
    transformation_ctx="raw")

mapped = raw.apply_mapping([
    ("order id", "string", "order_id", "string"),
    ("order date", "string", "order_date", "date"),
    ("store", "string", "store", "string"),
    ("amount", "string", "amount", "string"),
    ("status", "string", "status", "string"),
], transformation_ctx="mapped")

df = mapped.toDF()
from pyspark.sql import functions as F
df = (df.withColumn("amount", F.regexp_replace("amount", ",", "").cast("long"))
        .withColumn("status", F.lower(F.trim("status")))
        .dropDuplicates()
        .filter(F.col("store").isNotNull() & (F.col("store") != ""))
        .withColumn("year", F.date_format("order_date", "yyyy"))
        .withColumn("month", F.date_format("order_date", "MM"))
        .withColumn("day", F.date_format("order_date", "dd")))

from awsglue.dynamicframe import DynamicFrame
out = DynamicFrame.fromDF(df, glueContext, "out")
glueContext.write_dynamic_frame.from_options(
    frame=out, connection_type="s3",
    connection_options={"path": args["out_path"], "partitionKeys": ["year", "month", "day"]},
    format="parquet", transformation_ctx="sink")
job.commit()

apply_mapping の対応表は「(元の列, 元の型, 新しい列, 新しい型)」の組で、書かなかった列は結果から落ちます。元の列名はカタログに登録された名前に合わせます。transformation_ctx はジョブのブックマーク(前回どこまで処理したかの記録)で使われる名前で、job.init が状態を読み、job.commit で保存されます。ブックマークは既定では無効で、ジョブを起動するときのパラメーターで有効にします。

Python シェルのジョブ

Python シェルは 0.0625 DPU(既定)か 1 DPU で動き、ローカルのディスクは 20GB です。ライブラリのまとまりを analytics にすると、Python 3.9 では pandas 1.4.2・numpy 1.22.3・boto3 1.21.21・awswrangler 2.15.1 などが最初から使えます(Python シェルの文書の表)。同じ変換は次の形になります(こちらも構文の確認だけ)。

import sys
import awswrangler as wr
from awsglue.utils import getResolvedOptions

args = getResolvedOptions(sys.argv, ["in_path", "out_path"])
df = wr.s3.read_csv(args["in_path"], dtype=str)
df = df.rename(columns={"Order ID": "order_id", "order date": "order_date"})
df["amount"] = df["amount"].str.replace(",", "", regex=False).astype("int64")
df["status"] = df["status"].str.strip().str.lower()
df = df.drop_duplicates().dropna(subset=["store"])
d = df["order_date"].str.split("-", expand=True)
df["year"], df["month"], df["day"] = d[0], d[1], d[2]
wr.s3.to_parquet(df, args["out_path"], dataset=True,
                 partition_cols=["year", "month", "day"],
                 database="sales", table="orders", mode="append")
  • Python シェルではジョブのブックマークを使えません。
  • Python 3.9 以降では .egg でライブラリを渡せず、.whl を使います。pip のモジュールは --additional-python-modules で足せます。
  • AWS は「Python シェルのジョブからの移行」という文書で、Spark のジョブ・Lambda・ECS と Fargate・MWAA・SageMaker の学習ジョブを移行先として挙げています。Spark のジョブはワーカーが最低2つで、スクリプトを分散向けに直さずに移すと1つしか使われず費用が増える、と注意しています。

Glueのジョブと同じ変換をpandasで動かした結果

この節では、Glue のジョブで行う変換を手元の pandas と pyarrow で実際に動かし、入力と出力の中身・大きさを比べた結果が分かります。

自作の注文データ(3日分の CSV・30,066行)を、前の節のスクリプトと同じ手順で変換しました。 入力には、ETL でよく出会う汚れを混ぜています。金額の5%を「19,162」のようにカンマ入りにし、店舗の約1%を空に、状態の一部を「PAID 」(大文字と末尾の空白)に、約0.2%の行を重複させました。

Order ID,order date,store,amount,status
O000001,2026-11-10,fukuoka,8068,shipped
O000002,2026-11-10,tokyo,7717,shipped
O000003,2026-11-10,osaka,2624,shipped
import glob, pandas as pd, pyarrow as pa, pyarrow.parquet as pq
df = pd.concat([pd.read_csv(p, dtype=str) for p in sorted(glob.glob("raw/*.csv"))],
               ignore_index=True)
df = df.rename(columns={"Order ID": "order_id", "order date": "order_date"})
df["amount"] = pd.to_numeric(df["amount"].str.replace(",", "", regex=False)).astype("int64")
df["status"] = df["status"].str.strip().str.lower()
df["order_date"] = pd.to_datetime(df["order_date"], format="%Y-%m-%d")
df = df.drop_duplicates()
df = df[df["store"].notna()]
df["year"] = df["order_date"].dt.strftime("%Y")
df["month"] = df["order_date"].dt.strftime("%m")
df["day"] = df["order_date"].dt.strftime("%d")
pq.write_to_dataset(pa.Table.from_pandas(df, preserve_index=False), "curated",
                    partition_cols=["year", "month", "day"], compression="snappy")
読み込み (30066, 5)
重複を除いた行 66
store が空で除いた行 281
書き出し 29719 行 0.72秒
CSV合計 1207544 bytes / Parquet合計 379383 bytes
['year=2026', 'month=11', 'day=10'] 126484
['year=2026', 'month=11', 'day=11'] 126616
['year=2026', 'month=11', 'day=12'] 126283
{'shipped': 9996, 'paid': 9872, 'cancelled': 9851}
31%Parquet の大きさ(CSV 比)1,207,544 → 379,383 バイト
347行変換で除いた行重複66・店舗が空281
0.72秒手元の変換時間3万行・1スレッド

3万行なら手元のパソコンで1秒かからずに終わります。 この規模のデータを Glue の Spark ジョブで処理すると、処理そのものより最低課金と起動の時間が目立ちます。pandas の書き方は、関連記事「pandasの使い方 逆引き81選|pandas 3.0の実行結果つき」で扱っています。

金額の列の直し方

避けたい文字列のまま数値の列に変換する。カンマ入りの値が1つでもあると、変換が止まるか、その行が欠損になる
→
代わりに先にカンマを取り除いてから型を変える。変換できなかった件数を数えて、ログに残す

Spark でも pandas でも同じ考え方

状態の値のそろえ方

避けたい「PAID 」と「paid」を別の値のまま集計する
→
代わりに空白を取り、小文字にそろえてから、許す値の一覧と比べる

そろえたあとは3種類に収まった

AthenaとAWS Glueの関係(Data Catalogを共有する)

この節では、Athena と AWS Glue の違いと、2つがどうつながっているのかが、手元で動かした SQL の結果とあわせて分かります。

Athena は S3 のデータに SQL を投げるサービスで、テーブルの定義は AWS Glue Data Catalog に置かれます。 Athena の文書は「Athena は AWS Glue Data Catalog を使って、S3 にあるデータのテーブル名・列名などのメタデータを保存する」と書き、そのメタデータが Athena のクエリエディタに出るデータベース・テーブル・ビューになると説明しています。表の定義は、Glue のクローラーで作っても、Athena の CREATE TABLE で作ってもかまわず、どちらで作っても両方から見えます。

比べる点 AWS Glue Amazon Athena
役割 表の定義の管理・データの変換 SQL でデータを読む
出力 S3 のファイル・カタログのテーブル クエリの結果
料金の単位 DPU 時間・カタログのオブジェクト Athena の料金ページの単位(スキャン量など)
共有するもの Data Catalog のデータベースとテーブル

クローラーを使わずに Athena で表を作るなら、前の節で組み立てた定義は次の DDL と同じ内容です(この環境では Athena では実行していません)。

CREATE EXTERNAL TABLE sales.orders (
  order_id   string,
  order_date timestamp,
  store      string,
  amount     bigint,
  status     string
)
PARTITIONED BY (year string, month string, day string)
STORED AS PARQUET
LOCATION 's3://example-bucket/curated/orders/';

パーティションで読む量を絞る(DuckDB で確かめた)

Athena の代わりに DuckDB 2.0.0 で、同じ Hive 形式のフォルダーに SQL を投げました。WHERE day='11' を付けると、3つのファイルのうち1つだけが読まれました。

SELECT store, count(*) AS n, sum(amount) AS total
FROM read_parquet('curated/**/*.parquet', hive_partitioning=true)
WHERE day='11' AND status<>'cancelled'
GROUP BY store ORDER BY store;
[('fukuoka', 1708, 26348548), ('nagoya', 1587, 23544869), ('osaka', 1598, 24377234), ('tokyo', 1648, 25427223)]
│ Filters: status != 'cancelled'
│ File Filters: day = 11
│ Scanning Files: 1/3
│ Total Files Read: 1

日付で分けて置くと、日付で絞る SQL は該当するフォルダーだけを読みます。 Glue のジョブの中でも同じ考え方が使え、デベロッパーガイドは push_down_predicate(カタログのパーティション情報で先に絞る)と、パーティションのインデックスを使う catalogPartitionPredicate を紹介しています。CloudTrail のログを Athena で読む具体例は、関連記事「CloudTrailで誰が操作したか調べる|lookup-eventsとAthena」で扱っています。

dynamic_frame = glueContext.create_dynamic_frame.from_catalog(
    database="sales", table_name="orders",
    transformation_ctx="datasource0",
    push_down_predicate="year='2026' and month='11'")

AWS Glueの始め方(クローラーからETLジョブ実行まで)

この節では、AWS Glue で最初のクローラーとジョブを動かすまでの順番が分かります。

流れは「S3 にデータを置く → Glue が使う IAM ロールを用意する → クローラーで表を作る → ジョブで変換する → Athena で確かめる」の5段階です。

1

S3 にデータを置く

入力(raw)と出力(curated)、スクリプトの置き場所を、プレフィックスで分ける。日付で分けるなら最初から year=・month=・day= の形にする。

S3

2

IAM ロールを作る

Glue が引き受けるロールに、Glue の実行に要る権限と、対象の S3 のプレフィックスの読み書きの権限を付ける。読めないと、クローラーやジョブが権限のエラーで止まる。

IAM

3

クローラーで表を作る

データの場所(S3 のパス)、ロール、出力先のデータベースを決めて動かす。できたテーブルの列と型、パーティションを画面か CLI で確かめる。

クローラー・カタログ

4

ジョブを作って動かす

Glue Studio の画面で箱をつなぐか、スクリプトを書く。版(GlueVersion)・ワーカーの種類と数・タイムアウトを決める。

ETL ジョブ

5

Athena で確かめる

出力先にクローラーをもう一度かけるか CREATE TABLE で表を作り、件数・合計・パーティションを SQL で確かめる。

Athena

AWS CLI で同じことをするなら、次のコマンドが中心になります(この環境では AWS に接続しないため実行していません。名前・ARN・バケットは例です)。

aws glue create-database --database-input '{"Name":"sales_raw"}'

aws glue create-crawler --name orders-raw-crawler \
  --role arn:aws:iam::123456789012:role/GlueServiceRole \
  --database-name sales_raw \
  --targets '{"S3Targets":[{"Path":"s3://example-bucket/raw/orders/"}]}'
aws glue start-crawler --name orders-raw-crawler

aws glue create-job --name orders-etl \
  --role arn:aws:iam::123456789012:role/GlueServiceRole \
  --command Name=glueetl,ScriptLocation=s3://example-bucket/scripts/glue_job.py,PythonVersion=3 \
  --glue-version 5.1 --worker-type G.1X --number-of-workers 2 --timeout 30 \
  --default-arguments '{"--out_path":"s3://example-bucket/curated/orders/"}'
aws glue start-job-run --job-name orders-etl

CLI の認証情報やプロファイルの設定は、関連記事「AWS CLI設定|aws configureとprofile切り替え・優先順位」で扱っています。

始める前の確かめごと

  • 1予算アラートを作ったかジョブの止め忘れ・スケジュールの誤りに早く気づく
  • 2ジョブのタイムアウトを決めたか空欄だと Glue 5.0 以降は480分、4.0 以前は2,880分
  • 3版を明示したか既定の版は文書によって記載が違った
  • 4入力と出力のプレフィックスを分けたか出力を入力に混ぜるとクローラーが別のテーブルを作る
  • 5扱うデータの決まりを確かめたか個人情報・機密情報は所属先の決まりと提供元の最新の規約で

Glueのバージョンとワーカーの種類(6.0・5.1)

この節では、Glue の版ごとの Spark・Python の版と、ワーカーの種類ごとの大きさが分かります。

Glue の版(GlueVersion)は、ジョブで使う Spark と Python の版を決めます。 版の一覧(デベロッパーガイドの「AWS Glue のバージョン」)は次のとおりです。

Glue の版 Spark Python Java 状態(2026年11月13日時点)
6.0 4.1.1 3.13 17 2026年8月に一般提供。30%の値下げ
5.1 3.5.6 3.11 17 提供中
5.0 3.5.4 3.11 17 提供中
4.0 3.3.0 3.10(Ray は 3.9) 8 提供中
3.0 3.1.1 3.7 8 提供中
2.0・1.0・0.9 2.4.3・2.2.1 3.7・2.7 など ― 2026年4月1日に提供終了(EOL)

版を指定しないジョブの既定は、確認日の時点で文書によって記載が違いました。 版の一覧のページは「版を指定せずに作ったジョブの既定は Glue 5.1」と書き、API の Job の説明は「既定は Glue 6.0」と書いています。料金も Spark の版も変わるため、ジョブでは版を明示しておくのが確実です。Glue 6.0 への移行では、AWS 公式ブログが Spark 4.1・Python 3.13・Scala 2.13 への更新と、AWS SDK for Java 1.x の削除を挙げています。

提供終了(EOL)を迎えた版では、新しいジョブを作れず、ジョブの実行も始められず、動いているジョブも止められます(版のサポート方針)。Python シェルの 3.6 は2026年6月1日に提供終了になりました。

ワーカーの種類

ワーカー DPU vCPU・メモリ ディスク
G.025X 0.25 2・4GB 84GB(Glue 3.0 以降のストリーミング向け)
G.1X 1 4・16GB 94GB
G.2X 2 8・32GB 138GB
G.4X・G.8X 4・8 16・64GB/32・128GB 256GB/512GB
G.12X・G.16X 12・16 48・192GB/64・256GB 768GB/1024GB
R.1X〜R.8X(メモリ重視) 1〜8 M-DPU 4・32GB 〜 32・256GB 94GB〜512GB

G.12X・G.16X と R 系は、Glue 4.0 以降の Spark ETL ジョブで、一部のリージョンだけで使えます(API の説明)。Flex 実行クラスは Glue 3.0 以降の Spark(glueetl)だけで選べ、開始と終了の時刻がずれてよいジョブ向けです。

  1. 1まず G.1X × 2 で動かすいちばん小さい構成で、時間とメモリの様子を見る
  2. 2遅ければワーカーの数を増やす並列に分けられる処理なら、DPU 時間がほぼ同じまま早く終わる
  3. 3メモリが足りなければ G.2X 以上か R 系へ結合や集計で1台に寄るデータが大きいとき
  4. 4急がないジョブは Flex を試す夜間の集計など、終わる時刻に幅があってよい処理

Glue Data Qualityとワークフロー(品質チェックと順番)

この節では、Glue Data Quality のルールの書き方と、手元で同じ形のルールを判定した結果、ワークフローの役割が分かります。

Glue Data Quality は、DQDL(Data Quality Definition Language)で書いたルールを、テーブルやジョブの途中のデータに当てて合否を出す機能です。 DQDL の文書は、Rules(大文字始まり)という名前のリストを角かっこで囲んで書く、と説明しています。

Rules = [
  RowCount > 0,
  IsComplete "order_id",
  IsUnique "order_id",
  IsComplete "store",
  ColumnValues "status" in ["paid", "shipped", "cancelled"],
  Completeness "store" > 0.95
]

このルールを変換の前(raw)と後(curated)に当てました。判定には Glue ではなく、6種類のルールだけを読む自作の Python のスクリプトを使っています。

== raw 30066 行
  PASS  RowCount > 0  -> 30066
  PASS  IsComplete "order_id"  -> 1.0
  FAIL  IsUnique "order_id"  -> 66
  FAIL  IsComplete "store"  -> 0.9907
  FAIL  ColumnValues "status" in ["paid", "shipped", "cancelled"]  -> ['PAID ']
  PASS  Completeness "store" > 0.95  -> 0.9907
== curated 29719 行
  PASS  RowCount > 0  -> 29719
  PASS  IsComplete "order_id"  -> 1.0
  PASS  IsUnique "order_id"  -> 0
  PASS  IsComplete "store"  -> 1.0
  PASS  ColumnValues "status" in ["paid", "shipped", "cancelled"]  -> []
  PASS  Completeness "store" > 0.95  -> 1.0

「欠損なし(IsComplete)」と「95%より多く埋まっている(Completeness > 0.95)」では、同じデータでも結果が分かれました。 店舗の埋まり具合は 0.9907 で、前者は FAIL、後者は PASS です。止めたい条件と、知らせるだけの条件を分けて書くと、ジョブが必要以上に止まりません。料金ページでは、Data Quality のタスクは最低2 DPU・最低1分で、ETL ジョブの中での異常の検出には追加料金がかからない、と説明されています。

トリガーとワークフロー

トリガーは、決めた時刻かイベントでジョブを起動します(公式の用語集)。ワークフローは、クローラーとジョブとトリガーをつないで、前の処理が終わったら次を動かす、という順番を1つの図で管理する仕組みです。Lambda や他のサービスも含めて順番を組みたいときは、Step Functions から Glue のジョブを起動する構成もあり、関連記事「Step Functions入門|ASLの書き方とLambda連携・Retry」で扱っています。

よくあるエラーとつまずき(原文つき)

この節では、Glue の ETL でよく出会うエラーを手元で再現した原文と、Glue 側で起きやすいつまずきの原因と直し方が分かります。

次の3つは、Glue のジョブの中でも同じ原因で起きるものを、pandas・pyarrow・DuckDB で再現した原文です。

--- 1 カンマ入りの金額をそのまま数値に(pandas)
ValueError: Unable to parse string "19,162" at position 13
--- 2 パーティションごとに型が違う(pyarrow)
ArrowInvalid: Failed to parse string: '1,200' as a scalar of type int64
--- 2 同じデータを DuckDB で読む
ConversionException: Conversion Error: Error while reading file "mixed/day=11/....parquet":
failed to cast column "amount" from type VARCHAR to BIGINT: : Could not convert string '1,200' to INT64
--- 3 フォルダー名が key=value でない(2026/11/10/)
[('amount', 'BIGINT', 'YES', None, None, None)]   ← 日付の列が1つもできない
症状・表示 原因 直し方
Unable to parse string "19,162" 数値の列にカンマ・単位などの文字が混ざっている 文字を取り除いてから型を変える。変換できない件数を数える
Failed to parse string ... as a scalar of type int64 日によって同じ列の型が違うファイルを書き出した 書き出す前に型を固定する。過去分を書き直す
パーティションの列ができない・partition_0 になる フォルダー名が key=value の形でない 出力を year=・month=・day= の形にする。列名は画面で変えられる
クローラーがテーブルをたくさん作る 形式・圧縮・スキーマ・見出し行が混ざっている 入力のプレフィックスを形式ごとに分ける。グループ化の設定を使う
Athena で新しい日のデータが出ない 新しいパーティションがカタログに登録されていない クローラーを動かすか、Athena の MSCK REPAIR TABLE で読み込む
AccessDenied でジョブやクローラーが止まる Glue のロールに S3 のプレフィックスの権限がない ロールのポリシーに対象のバケットとプレフィックスを足す
Spark ジョブにしたら費用が増えた Python シェルのスクリプトをそのまま移し、ワーカー1つしか使っていない 分散向けに書き直すか、小さな処理は別のサービスを選ぶ
.egg のライブラリが読み込めない Python 3.9 以降の Python シェルは .egg に対応しない .whl にするか --additional-python-modules で入れる

判断表(AWS Glueを選ぶ場面・ほかのサービスを選ぶ場面)

この節では、AWS Glue が合う処理と、AWS の別のサービスが合う処理の見分け方が分かります。

Glue は「カタログと一緒に、ある程度大きなデータを、決まった間隔で変換する」処理に合います。 小さく短い処理、長く動き続ける処理、クラスターを細かく調整したい処理では、AWS の文書が挙げる別のサービスも候補になります。ここでは優劣ではなく、条件ごとの向き不向きを並べます。

こんな処理 候補 理由(公式の説明・この記事の計算)
S3 の大きなデータを毎日変換し、Athena で読む Glue の Spark ジョブ+カタログ 分散処理・パーティションの書き出し・表の定義を1か所で
表の定義だけほしい(変換は要らない) クローラー、または Athena の CREATE TABLE 定義はどちらで作っても Data Catalog に入る
数十 MB 程度を pandas で整える Python シェル(0.0625 DPU)・Lambda Spark のジョブは最低2ワーカー。小さな処理では割高になりやすい
数秒の処理を毎分のように回す Lambda など ジョブは最低1分の課金。10秒の処理は実時間の6倍の請求
時間の上限なく動かし続けたい ECS・Fargate 移行の文書は「最大のタイムアウトがない」と説明
Hadoop の環境を直接さわりたい Amazon EMR よくある質問は EMR を「Hadoop の環境に直接アクセスできる」と説明
急がない夜間の集計 Glue の Flex 実行クラス よくある質問は「最大35%」の費用の削減と説明

サーバーレスで何を自分で作らずに済ませるかの考え方は、関連記事「S3に、そのままSQL。クラウド技術8選|Textract・Lambda Function URLs・Cognito」で扱っています。

よくある質問(AWS Glue)

この節では、AWS Glue について検索されることの多い質問への短い答えが分かります。

Q. AWS Glue の読み方は?
A. 「グルー」です。英語の glue(のり)に由来します。

Q. AWS Glue に無料枠はありますか?
A. Data Catalog は、最初の100万オブジェクトの保存と、最初の100万回のアクセスが無料です(料金ページ)。ジョブとクローラーには、料金ページに無料の枠の記載はありません。DataBrew は初めての利用で最初の40回のインタラクティブセッションが無料と、よくある質問に書かれています。

Q. DPU とは何ですか?
A. 処理能力の単位で、1 DPU は 4 vCPU と 16GB のメモリです。G.1X のワーカー1台が 1 DPU、G.2X が 2 DPU にあたります。

Q. Glue を使うにはプログラミングが要りますか?
A. Glue Studio の画面で箱をつなげばスクリプトが生成されます。細かい変換や不具合の調査では、生成された PySpark を読めると進めやすくなります。

Q. Glue と Athena はどちらを使えばよいですか?
A. 役割が違うため、多くの構成で両方を使います。Glue が表の定義と変換、Athena が SQL での読み出しを受け持ち、Data Catalog を共有します。

Q. クローラーは毎回動かす必要がありますか?
A. 列が増えるなどスキーマが変わるとき、新しいパーティションを登録したいときに動かします。フォルダーの形が決まっているなら、Athena の CREATE TABLE と MSCK REPAIR TABLE、またはジョブからの登録で代わりにできることもあります。最低10分の課金を考えて、頻度を決めます。

Q. Glue Data Catalog は Hive メタストアの代わりになりますか?
A. よくある質問は、Data Catalog を「Apache Hive メタストアと互換で、そのまま置き換えられる」と説明しています。

Q. Glue 6.0 にすると必ず安くなりますか?
A. AWS は DPU 時間あたり30%安いと説明しています。かかる時間は処理の中身で変わるため、移行前に同じデータで時間を比べると、請求額の見込みが立ちます。Spark 4.1・Python 3.13 への変更で動かなくなる処理がないかも確かめます。

Q. 個人情報を含むデータを Glue で扱ってもよいですか?
A. 扱えるかどうかは、所属先の決まりと AWS の最新の規約・資料で事前に確かめます。

まとめ

  • AWS Glue は、表の定義(Data Catalog)と変換(ETL ジョブ)をサーバーなしで動かすデータ統合サービスで、Athena とはカタログを共有する。
  • 料金は DPU × 時間 × 単価。料金ページの基本の表示は 0.44 USD/DPU 時間で、ジョブは最低1分、クローラーは最低10分。公式の料金例4つを計算式で再現できた。
  • 毎日 10 DPU で15分のジョブは月 33.00 USD、Glue 6.0 の30%引きで 23.10 USD。短いジョブとクローラーは最低課金で実時間より高くなる。
  • 同じ変換を pandas で動かすと、3万行の CSV が 0.72秒で Parquet(大きさは31%)になり、日付で分けたことで SQL は3ファイル中1ファイルだけを読んだ。
  • ジョブでは版・ワーカー・タイムアウトを明示し、DQDL で「止める条件」と「知らせる条件」を分けて書く。

参考・出典

いずれも確認日は2026年11月13日です。

  • AWS「AWS Glue とは」:https://docs.aws.amazon.com/ja_jp/glue/latest/dg/what-is-glue.html
  • AWS「AWS Glue concepts」:https://docs.aws.amazon.com/glue/latest/dg/components-key-concepts.html
  • AWS「AWS Glue の料金」:https://aws.amazon.com/jp/glue/pricing/
  • AWS「AWS Glue FAQs」:https://aws.amazon.com/glue/faqs/
  • AWS「AWS Glue 6.0 delivers 30% price reduction and Iceberg v3 support」(2026年8月21日):https://aws.amazon.com/about-aws/whats-new/2026/08/aws-glue-6-0-price-reduction-iceberg-v3/
  • AWS Big Data Blog「Introducing AWS Glue 6.0 for Apache Spark」(2026年8月24日):https://aws.amazon.com/blogs/big-data/introducing-aws-glue-6-0-for-apache-spark/
  • AWS「AWS Glue versions」:https://docs.aws.amazon.com/glue/latest/dg/release-notes.html
  • AWS「AWS Glue version support policy」:https://docs.aws.amazon.com/glue/latest/dg/glue-version-support-policy.html
  • AWS「Jobs」(API):https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-jobs-job.html
  • AWS「Configuring job properties for Python shell jobs in AWS Glue」:https://docs.aws.amazon.com/glue/latest/dg/add-job-python.html
  • AWS「Migrate from AWS Glue Python shell jobs」:https://docs.aws.amazon.com/glue/latest/dg/pyshell-migration.html
  • AWS「Managing partitions for ETL output in AWS Glue」:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-partitions.html
  • AWS「DynamicFrame class」:https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-dynamic-frame.html
  • AWS「Tracking processed data using job bookmarks」:https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html
  • AWS「Data Quality Definition Language (DQDL) reference」:https://docs.aws.amazon.com/glue/latest/dg/dqdl.html
  • AWS ナレッジセンター「AWS Glue クローラーが複数のテーブルを作成するのはなぜですか?」:https://aws.amazon.com/premiumsupport/knowledge-center/glue-crawler-multiple-tables/
  • AWS「Use AWS Glue Data Catalog to connect to your data」(Athena):https://docs.aws.amazon.com/athena/latest/ug/data-sources-glue.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS Glueとは|できること・料金(DPU)とクローラー・ETLの始め方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー