【AWS】Glueでの型の厳密さに泣きを見た話
概要
最近業務で、Glueに触れる機会がありました。
Glueは、日本語で「糊(のり)」という意味があり、AWS上の各種サービスをノーコードで移行元から移行先へ連携させるのですが、連携の際に柔軟な変更を加えたうえで、連携させるという事が可能なETLツールです。Transformの工程に、自作のPythonスクリプトなどを柔軟に組み込むといったことも可能なので、Glueを利用しつつ独自の要件を叶えるといった使い方もできそうです
自分ではコードが書けないといった方には、DataBrewというサービスがあり、そちらを利用すればノーコードで様々な変換が実現できてしまうので、そういった方も是非一度調べてみてください。
今回は、そんな便利なサービスGlueで直面をした問題に関して、備忘録として残しておきます。
ざっくり構成
図をまとめる余裕がないので、テキストで書きます。
S3 → Glue → DB
今回はTranform工程では、無加工でS3にあるデータの一部をDB側に登録をするといった単純な連携だけを行いました。
問題点
上記構成で、特に変換など掛けるわけでもなくただデータを連携するという事で、Glueの実行の完了を待って、DBのデータを確認したのですが、本来入るべきデータがなぜかNULLになってしまっていたのです。
よくよく見ると数値系のデータだけがNULLになってしまっているようで、varcharなどはきれいにデータが入っています。
数値系のデータの中でもうまく登録されているものもあれば、NULLになってしまうものも有り、まずは問題の切り分けから行う必要が出てきました。
原因
上記問題が発生していた理由ですが、移行元S3側の数値データに小数点が入っていたことでした。
厳密にいうと、「S3データに小数点が入っていて、RDSの型が小数点の取り扱いができない型になっている。更に、GlueのS3側のデータの指定でデータカタログを使用しなかった(S3の対象オブジェクトのパスを直接指定してしまっていた)。」以上の3つの条件がすべてそろっている場合に問題につながります。
■NG例
S3:1.0, 2.0 , 111.1, 150.9
DB : INTEGER, BIGINT, INTEGER, BIGINT
上記のような組み合わせはダメで、DB側にはデータが連携されません。(NULLになります)
※ただし、NG例にしていてもS3の指定でデータカタログを使っている場合は、小数点以下が削れてDBにデータが登録されるようです。(小数点以下が切り捨て・四捨五入何れの扱いになるかまでは検証できておりません。)
■OK例
S3 : 1 , 2 , 1000, 10
DB : INTEGER, BIGINT, INTEGER, BIGINT
こちらはデータがちゃんと登録されます。
当然ながらS3のデータにとらわれずに登録をする手段として、DB側の型をすべて小数点が取り扱える型にするといった形でも良いかと思いますが、なるべく厳密な型定義にしておいた方が情報量も増えると思いますし、余計な誤解を生まないので良いでしょう
終わりに
まだまだGlueには触れ始めたばかりなので、AWSのエラーメッセージと戦うよりもコードを書いた方が楽だ!と思ってしまう私ですが、コードを書くと保守に工数を割く時間が長くなると思いますし、ある程度なれるとスムーズに構築が出来るようになると思うので、めげずに頑張りたいと思います。
今回DBは、RDSを利用したのですが、GlueとRDSの接続にもかなり苦戦をしましたので、次回はそういった情報まとめる記事を作成する予定です
ではでは!