Glue Studio で DynamoDB JSON を CSV に変換するジョブを作成してみる

2022.09.06

いわさです。

先日 DynamoDB の S3 インポートを行う際に、CSV の場合だと文字列として取り込まれる関係で DynamoDB JSON へ変換を行いました。

出来れば Glue Job で変換してみたくてその後調べています。
調べていたところ、どうやら DynamoDB JSON からの変換であれば簡単に出来そうだということがわかりました。

DynamicFrame クラスにunnest_ddb_jsonという専用の機能が用意されているようです。
その逆の機能はまだ見つけれていないのですが、今回はunnest_ddb_jsonを使って Glue Studio から DynamoDB JSON を CSV へ変換するジョブを作成してみました。

DynamoDB JSON のエクスポート

まずは前回の記事で作成した DynamoDB テーブルから S3 へのデータエクスポートを行ってみます。

前提として S3 へのエクスポート機能を使う場合は DynamoDB のポイントインタイムリカバリ(PITR)を有効化する必要があります。

そしてエクスポートされたファイル形式として DynamoDB JSON を指定します。
エクスポート形式としては DynamoDB JSON と Amazon Ion の2種類から選択することが出来ます。

S3 へは DynamoDB JSON 形式のデータが複数のファイルで出力されるので今回はそれを編集して以下のようにまとめて1ファイルに整理したものをインプットとして使用したいと思います。

{"Item":{"hoge_str":{"S":"iwasa1"},"hoge_num":{"N":"100"},"hoge_bool":{"BOOL":true}}}
{"Item":{"hoge_str":{"S":"iwasa2"},"hoge_num":{"N":"200"},"hoge_bool":{"BOOL":true}}}
{"Item":{"hoge_str":{"S":"iwasa3"},"hoge_num":{"N":"300"},"hoge_bool":{"BOOL":true}}}

ちなみに、CSV 形式でデータをエクスポートしたいだけであればコンソールの CSV ダウンロード機能が使えるのですが、今回は Glue ジョブで作成してみるぜというテーマなのでこの機能は使いません。

Glue Studio でジョブ作成

Glue Studio のビジュアルジョブエディターを使って構築していきます。

S3 ソース

こちらは先程作成した JSON ファイルを格納した S3 バケットを指定し、データフォーマットに JSON を指定します。

Custom Transform

カスタム変換を使って変換処理を実装します。

カスタム変換のサンプルでは、DynamicFrameCollection から DynamicFrame を取得しつつ、DataFrame へ変換してから一般的な抽出処理を行う流れになっていましたが、今回使いたいunnest_ddb_jsonは DynamicFrame に実装されているので、コレクションから抽出して変換機能を使い、またコレクションで戻すようにだけしてみました。

def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
    hoge_dynamicframe = dfc.select(list(dfc.keys())[0])
    unnested_dynamicframe = hoge_dynamicframe.unnest_ddb_json()
    return (DynamicFrameCollection({"CustomTransform0": unnested_dynamicframe}, glueContext))

Select From Collection

次の S3 ターゲットで最終的な出力を行うのですが、そちらのコンポーネントでは DynamicFrameCollection を受け取ることが出来ません。
カスタム変換は DynamicFrameColleciton が出力になっているので、Select From Collection を使って単一の DynamicFrame を抽出しています。

S3 ターゲット

最後は出力先の S3 バケットを指定しつつ、データフォーマットに CSV を指定します。

実行

作成したジョブを実行し、出力されたファイルを確認してみましょう。

hoge_str,hoge_num,hoge_bool
iwasa1,100,true
iwasa2,200,true
iwasa3,300,true

DynamoDB JSON 形式のファイルが CSV へ変換されました。
微調整必要そうですが概ね良さそうですかね。

さいごに

本日は Glue Studio で DynamoDB JSON を CSV に変換するジョブを作成してみました。

DynamicFrame に専用の変換処理が用意されてるだけあって Glue 初心者の私にも実装することが出来ました。
一方で、最終的には逆の変換(CSV -> DynamoDB JSON)を行いたいのでうまい方法は引き続き探さねばと思っています。