Glue DataBrew のハンズオンをやって操作感を掴んでみた & Athena 経由で加工済みデータを可視化してみた

Glue DataBrew のハンズオンをやって操作感を掴んでみた & Athena 経由で加工済みデータを可視化してみた

DataBrew は Excelのような即時反映ではなく、サンプリングデータに対して Web UI で操作→バッチ処理で全体に適用、という流れです。
Clock Icon2025.07.02

コーヒーが好きな emi です。

Excel や Google スプレッドシートを使っていて、容量が 700MB~1000MB 程度に大きくなってくると操作が重くなります。
Glue DataBrew であれば Excel や Google スプレッドシートのように GUI でデータをフィルタしたり加工したりできるのか?と疑問に思うことがあったので、触ってみて操作感を掴んでみました。

先に操作して分かったこと

  • DataBrew は Excel のような即時反映ではなく、サンプリングデータに対して Web UI で操作→バッチ処理で全体に適用 という流れです。

  • プレビューはサンプリングデータのみなので、Excel ほどの即時性や軽快さはありません

  • 700MB 程度ならプレビューや変換レシピの作成は十分可能ですが、全データへの処理(ジョブ実行)はバッチ処理となり、完了まで数分~十数分かかる場合もあります。

  • Excel のように全件を即時編集・即時反映することはできません

  • サンプリングデータで操作内容を確認し、問題なければ全データにバッチ適用する、という「ETLツール的な使い方」になります。

  • 700MB程度なら、サンプリング・プレビュー・レシピ作成は快適ですが、「全件をその場で編集・即時保存」はできません。

https://docs.aws.amazon.com/ja_jp/databrew/latest/dg/what-is.html

構成イメージ

実施したハンズオンは以下のものです。
https://dcj71ciaiav4i.cloudfront.net/322031A0-7CA9-11EB-8D02-B70DEDD8DFCB/

全体の流れはこんな形です。
glue-databrew-trial_75

  • S3 バケット input 用に、元になる Excel ファイルをアップロードする
  • Glue DataBrew で S3 input 用にアップロードした Excel ファイルを加工する(①)
  • Glue DataBrew で 加工したファイルを S3 バケット output 用に出力する(②)
  • S3 バケット output 用に出力されたファイルを Athena でクエリする(③)
  • Athena をデータソースとする QuickSight データセットを作成し可視化する(④)

Glue DataBrew の中で行う操作のイメージ(①~②)は以下です。
glue-databrew-trial_76

  • データセットを作成
  • プロジェクトでレシピを作成
  • ジョブでレシピを実行し加工する

事前準備

事前にインプット用の S3 バケットとアウトプット用の S3 バケットを作成しておきます。

以下 2 種類のサンプルデータが Excel 形式で用意されているのでインプット用の S3 バケットにアップロードします。

  • sales.xlsx(60KB)
  • branches.xlsx(9KB)

glue-databrew-trial_1

Glue DataBrew の操作

データセットの作成

マネジメントコンソールで Glue DataBrew を開くとこんな感じです。少し他のサービスと印象が違いますね。ちなみに Glue と Glue DataBrew のマネジメントコンソールは別で、アイコンも別です。

データセットを開きます。
glue-databrew-trial_2

データセットの名前、Excel を格納した S3 バケットのパスで sales.xlsx を選択し、
glue-databrew-trial_3

ファイルタイプは Excel、シートタブ番号は 1 としてデータセットを作成します。
glue-databrew-trial_4

データセットを作成しました。同様に branches.xlsx でもデータセットを作成しまして、データセットが二つできた状態にします。
glue-databrew-trial_5

こんな感じでデータ内容がプレビューできます。
glue-databrew-trial_6

プロジェクトの作成

プロジェクトを作成します。プロジェクトではデータの加工を行うためのレシピを作成します。

  • 任意のプロジェクト名を入力
  • 新しいレシピを作成する、任意のレシピ名の入力
  • マイデータセットで sales.xlsx を選択

glue-databrew-trial_7

Glue DataBrew プロジェクト用の IAM ロールは新しいロールを作成します。
glue-databrew-trial_9

新しいロールのサフィックス(語尾につける文字列)を指定してプロジェクトを作成します。
glue-databrew-trial_10

プロジェクトが作成されるのを 1 分程度待ちます。
glue-databrew-trial_11

作成されると、以下のようにデータのプレビューが表示されます。
glue-databrew-trial_12

プロジェクトのデータプレビューについて

プロジェクトビューに表示されるデータはデータセットの一部がサンプリングされたものです。

デフォルトではデータセットの最初の 500 行でサンプリングされます。サンプリングサイズや選択される行は 「プロジェクトを編集」 から変更できます。
glue-databrew-trial_13

「サンプリング」 で、サンプリングする行をどのように抽出するか選択します。

  • 最初の n 行
  • 最後の n 行
  • ランダムな行

glue-databrew-trial_14

サンプリングする行数は以下から選択できます。

  • 500
  • 1,000
  • 2,500
  • カスタムサイズ(最大 5,000 行)

glue-databrew-trial_15

レシピの作成

DataBrew のレシピとは、 DataBrew に処理させたい一連の加工操作の集まりのようなものです。
例えば、

  • 日付のフォーマットを変更
  • 空欄(null)の削除
  • カンマの削除

…などのステップをレシピに登録しておいて、後からジョブでこのレシピを実行することでデータを加工できます。
レシピはダウンロードして他のプロジェクトで再利用したり、レシピをバージョン管理することも可能です。

ハンズオンでは以下のステップをレシピに登録します。

  • 空欄(null)の行、「計」の行を削除
  • 支店コードをキーに branches を結合
  • 「千円」を「000」に置換
  • カンマを削除
  • カラムを削除
  • 日付のフォーマットを変更
  • 文字列型から数値に変換

レシピの作成は Excel ライクに粛々と加工していくだけなので、トグルにしまっておきます。

レシピの作成

不要な行の削除(空欄(null)の行、「計」の行を削除)

支店コードの右の 「…」 をクリックし [欠落した値の削除または入力] - [欠落した行を削除] をクリックします。
glue-databrew-trial_16

  • 支店コードをキーに branches を結合- 欠落した値がある行を削除する
  • すべての行

を選択した状態でプレビューすると、
glue-databrew-trial_17

削除される行がこのようにオレンジで表示されます。問題なければ適用します。
glue-databrew-trial_18

適用すると、レシピにステップが追加されます。
glue-databrew-trial_19

「計」 になっている行の削除もできます。支店コードの列フィルターアイコンをクリックし、
glue-databrew-trial_20

以下のようにフィルタを設定して、
glue-databrew-trial_21

適用すると、
glue-databrew-trial_22

レシピに追加されます。
glue-databrew-trial_23

データセットの結合(支店コードをキーに branches を結合)

データセット同士の結合も可能です。上部バーの 「結合」 をクリックし、
glue-databrew-trial_24

結合するデータセットを選択して、
glue-databrew-trial_25

結合タイプと結合キーを指定します。
今回の内部結合タイプだと結合元と結合先で同じカラムができるので、片方の支店コードは外しておきます。
glue-databrew-trial_26

データ値の加工

「千円」を「000」に置換

売上実績の 「…」 アイコンをクリックし、[クリーン] - [値またはパターンの置き換え] をクリックします。
glue-databrew-trial_28

  • 置き換える値に 「千円」
  • 値に置き換える 「000」

として適用します。
glue-databrew-trial_29

置き換わります。
glue-databrew-trial_30

カンマを削除

売上実績の 「…」 アイコンをクリックし、[クリーン] - [カスタム値] をクリックします。
glue-databrew-trial_31

削除する値にカンマ (,) を入力して、
glue-databrew-trial_32

プレビューを確認して適用します。
glue-databrew-trial_33

カラムの削除

カラムのメニューから不要なカラムの削除もできます。
glue-databrew-trial_34

日付の書式変更

カラム名の左のアイコンをクリックすると、string 型、long 型など型を変更できます。処理日カラムを一旦文字列(string)型にします。
glue-databrew-trial_37

処理日カラムの 「…」 メニューから [フォーマット] - [日付時刻の形式] - [yyyy-mm-dd] を選択します。
glue-databrew-trial_39

glue-databrew-trial_40

処理日を date 型にします。
glue-databrew-trial_41

セッション切れ

一部 DataBrew プロジェクトの操作と操作の間で時間を置いたのですが、再度プロジェクトを開くと以下のように待ち時間が発生しました。
glue-databrew-trial_36

DataBrew プロジェクトには接続に インタラクティブセッション の概念があり、30 分操作せずに放置するとセッションが切れるそうです。30 分以上操作しないと再度プロジェクトを開くのに毎回 1 分程度待つことになります。

料金は 1 ユーザー 1 セッション 1 USD となっています。

https://aws.amazon.com/jp/glue/pricing/

ジョブの作成

DataBrew ジョブでは作成したレシピを実行します。
ジョブ名、加工したデータの出力先 S3 バケットのパスを指定します。
glue-databrew-trial_43

出力するファイルタイプは以下から選択できました。

  • CSV
  • Parquet
  • GlueParquet
  • Avro
  • ORC
  • XML
  • JSON
  • Tableau Hyper

glue-databrew-trial_72

加工済みデータファイルの出力形式について

ジョブの出力設定右上の 「設定」 を開くと、
glue-databrew-trial_73

「ファイルパーティショニング」 で出力ファイルの分割形式を選択できます。ちょっと Excel ファイルを加工して加工後も CSV を Excel で開きたい、みたいな場合は単一ファイル出力にしておくと便利そうです。
ただし、単一ファイル出力にするとジョブの実行時間が長くなる可能性があります。
glue-databrew-trial_74

https://aws.amazon.com/jp/blogs/news/create-single-output-files-for-recipe-jobs-using-aws-glue-databrew/

https://dev.classmethod.jp/articles/try-glue-databrew-file-export/


さて、ジョブの作成に戻ります。
ジョブ用の IAM ロールを新規作成します。IAM ロール名のサフィックスを指定しジョブを作成します。
glue-databrew-trial_44

説明を入力してレシピを発行します。
glue-databrew-trial_45

ジョブの実行

右上の 「ジョブを実行」 をクリックし、
glue-databrew-trial_46

ジョブを実行し、データを実際に加工します。
glue-databrew-trial_47

ジョブ完了までに 3~5 分程度かかりました。
参考ですが、sales.xlsx が 60KB で、branches.xlsx が 9KB でした。
glue-databrew-trial_48

アウトプット用の S3 バケットを確認すると、
glue-databrew-trial_49

以下のように複数のファイルの分かれて出力されました。
glue-databrew-trial_50

ファイルが複数だったので、AWS CLI でまとめてローカルにダウンロードして内容を確認します。

実行コマンド

aws s3 sync s3://databrew-handson-output-emikitani-20250603/sales-job_06Jun2025_1749189277671/ ./ --profile cm-kitani.emi

glue-databrew-trial_51_2

ちなみに私の手元の端末は Windows 11 でして、Windows 11 にインストールした WSL に 更に AWS CLI をインストールしてクレデンシャルをセットアップし、WSL を VSCode 拡張を使って VSCode で操作しています。
https://dev.classmethod.jp/articles/windows11-wsl2-vscode-setup/

WSL 内にダウンロードすると以下のようになっています。1KB のファイルと 6KB のファイルがあります。
glue-databrew-trial_52

6KB のファイルを開くと以下のようになっていました。対象都道府県ごとにファイルが分かれているようです。ちなみに 1KB のファイルを開くとカラム名だけでした。
glue-databrew-trial_53

Glue DataBrew で加工済のデータを Athena 経由でクエリする

さて、S3 バケット output 要に格納できたこの加工済みファイルを Athena 経由で QuickSight で可視化していきます。
まずは Athena で S3 バケット output 用にクエリしていきます。

まずはデータベースを作成します。Athena から作成しても良いのですが、Glue のコンソールから手動で作成しました。名前は sales-db としています。
glue-databrew-trial_54

この後ハンズオンの Glue クローラーの手順を実施したのですがどうにもうまくいかず… Athena 側からおとなしく外部テーブルを作成する SQL 文を書きました。

ハンズオンの Glue クローラーの手順を実施したがうまくいかず、1 つのテーブルにデータが出てほしいのに、分散した CSV ファイルごとにテーブルが作成されてしまった様子

glue-databrew-trial_55

あれあれ…

Athena テーブル作成失敗クエリ
  • 失敗クエリその1
    • ダブルクォーテーション(”)だと line 1:8: mismatched input 'EXTERNAL'. Expecting: 'MATERIALIZED', 'MULTI', 'OR', 'PROTECTED', 'ROLE', 'SCHEMA', 'TABLE', 'VIEW’ と言うエラーになる
失敗クエリその1
CREATE EXTERNAL TABLE IF NOT EXISTS "sales-db"."databrew_handson_output_emikitani_20250603" (
  "処理日" date,
  "支店コード" string,
  "売上実績" bigint,
  "売上目標" bigint,
  "支店名" string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim' = ',',
  'skip.header.line.count' = '1'
)
STORED AS TEXTFILE
LOCATION 's3://databrew-handson-output-emikitani-20250603/sales-job_06Jun2025_1749189277671/'
TBLPROPERTIES (
  'has_encrypted_data'='false'
);

glue-databrew-trial_56

  • 失敗クエリその2
    • long 型だと FAILED: ParseException line 1:129 cannot recognize input near 'long' ',' '売上目標' in column type になる。候補に出るのになぜ…
失敗クエリその2
CREATE EXTERNAL TABLE IF NOT EXISTS `sales-db`.`databrew_handson_output_emikitani_20250603` (
  `処理日` date,
  `支店コード` string,
  `売上実績` long,
  `売上目標` long,
  `支店名` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim' = ',',
  'skip.header.line.count' = '1'
)
STORED AS TEXTFILE
LOCATION 's3://databrew-handson-output-emikitani-20250603/sales-job_06Jun2025_1749189277671/'
TBLPROPERTIES (
  'has_encrypted_data'='false'
);

glue-databrew-trial_57

S3 の内容をクエリするための Athena 外部テーブル作成成功クエリは以下です。

CREATE EXTERNAL TABLE IF NOT EXISTS `sales-db`.`databrew_handson_output_emikitani_20250603` (
  `処理日` date,
  `支店コード` string,
  `売上実績` bigint,
  `売上目標` bigint,
  `支店名` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'field.delim' = ',',
  'skip.header.line.count' = '1'
)
STORED AS TEXTFILE
LOCATION 's3://databrew-handson-output-emikitani-20250603/sales-job_06Jun2025_1749189277671/'
TBLPROPERTIES (
  'has_encrypted_data'='false'
);

glue-databrew-trial_58

「テーブルをプレビュー」 で確認すると、以下のようにちゃんと S3 バケット output 用に出力された CSV ファイルの中身がクエリできています。
glue-databrew-trial_59

QuickSight で可視化する

QuickSight で可視化します。

可視化する前に、QuickSight の管理から S3 バケット output 用へのアクセスを許可しておきます。
glue-databrew-trial_60

では Athena をデータソースとしてデータセットを作成していきます。データソース名を指定します。ワークグループは primary を使っていたので primary を選択したまま進めます。
glue-databrew-trial_61

カタログはデフォルトの AwsDataCatalog を選択します。するとデータベースで先ほど作成した sales-db が選択できるはずですので、選択し、「データの編集/プレビュー」 を押下します。
glue-databrew-trial_62

データのプレビューが 1000 行表示されます。今回は直接クエリ(ダイレクトクエリ)のまま、「保存して視覚化」 でデータセットを保存し、分析を作成します。
glue-databrew-trial_63

作成で進めます。
glue-databrew-trial_64

垂直棒グラフのビジュアルを作成し、画像のように X 軸、値、グループ/色 を設定します。
glue-databrew-trial_65

画面上のバーのフィルターから処理日を選択し、
glue-databrew-trial_66

処理日が追加できたらコントロールを追加します。
glue-databrew-trial_67

再度フィルタを編集します。
glue-databrew-trial_68

処理日を範囲で選択できるようにします。
glue-databrew-trial_69

ビジュアルの変更もできます。
glue-databrew-trial_70

折れ線グラフにしてみました。
glue-databrew-trial_71

DataBrew 料金

DataBrew は以下の料金が発生します。詳細は料金ページを参照ください。

  • Glue DataBrew インタラクティブセッション
  • DataBrew ジョブ

https://aws.amazon.com/jp/glue/pricing/

おわりに

本記事への質問やご要望については画面下部のお問い合わせ「DevelopersIO について」からご連絡ください。記事に関してお問い合わせいただけます。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.