Fivetranによる自動データ型割当・自動データ型変換の挙動を確かめてみた #fivetran
さがらです。
DWHとコネクタへの接続設定を行うだけでデータロードを行ってくれるFivetranですが、データ型の割当もFivetranが自動で行ってくれるという仕様があります。
本記事ではこの仕様について検証してみたので、その内容をまとめてみます。
Fivetranの自動データ型割当・自動データ型変換について
まず、それぞれの仕様がどういったものか述べておきます。
自動データ型割当
Fivetranは、対象のデータをロードする際に各カラムの値を確認し、その値を正確に保持できかつ容量を最小限に抑えられるデータ型を決めて、そのデータ型をデフォルトのデータ型として割り当てるようになっております。
この時、下図の階層関係によって、データ型が決まるようになっております。上部に位置するほど多くの値を正確に保持でき容量も取ってしまうため、値を見てなるべく下部に位置するデータ型を割り当てようとFivetranはデータ型を推論してくれます。(下図は公式Docからの引用です。)
より具体的に、公式Docの例の引用ですが、以下のような流れで型の割当を行っております。
- あるカラムの値を見て、1レコード目には「9」を確認したので、
INT
型と推測する - 続いて2レコード目を見て、「9.90」を確認したので、小数点以下の値も正確に保持できる
DOUBLE
型ではないかと推測する - この2レコードの値を見て、
INT
とDOUBLE
に該当する値を確認したので、どちらの値も保持できるDOUBLE
型を対象のカラムのデータ型として定義する
自動データ型変換
Fivetranでは、2回目移行のデータ同期で、現在のカラムのデータ型では対応できないデータが確認できた場合、自動でデータ型を変換する仕様があります。
具体的な挙動としては、下記のような動きをします。
- 新しいデータ型で一時的な名前で新しいカラムを作成し、これまでの値をすべてコピーした値を持つようにする
- これまで用いていた古いデータ型を持つカラムを削除する
- 1番で作成した新しいカラムを、古いデータ型を持っていたカラムの名称に変更する
より詳しくは、下記の公式Docの「Changing data type」をご覧ください。
試してみた
では、実際にどのようにデータ型が割り当てられるのか、スプレッドシート➟Snowflakeの同期を試してみて確認したいと思います。
※スプレッドシート➟Snowflakeの、Fivetranを用いた同期手順についてはこちらのブログをご覧ください。
1回目の同期での自動データ型割当
まず、3行4列のこのようなデータをSnowflakeに同期してみます。
下図は実際のFivetranのログですが、初回の同期はこのデータ量であれば2分くらいで終わります。
同期完了後にテーブルを見ると、このような形で同期されていました。
各カラムのデータ型は下図のようになっておりました。Fivetranなら当たり前とは言えるのですが、IS_EXPRESS_DELIVERY
がBOOLEAN
、ORDER_DATE
がDATE
といった形でロードしてくれているのがありがたいですね!
2回目の同期での自動データ型割当
続いて、先程の3行4列のデータに対して、以下の変更を行ってみます。
order_id
カラムが「003」のレコードを削除order_id
カラムが「004」のレコードを追加 ※total_priceの値が「漢字」、is_express_deliveryの値が「日本語」、というイレギュラーが値を追加user_id
カラムを追加し、値も各行に入れる
この変更を行った後のスプレッドシートのデータは下図のようになります。
下図は2回目のFivetranのログですが、これも初回と同じく2分くらいで終わります。細かく見ると、ADD_COLUMN
やDROP_COLUMN
などの処理が走っていることがわかりますね。データ型を変更するために、一度カラムを削除して別の型のカラムを追加していることが伺えます。
2回目の同期完了後にテーブルを見ると、このような形で同期されていました。
各カラムのデータ型は下図のようになっておりました。USER_ID
列が新しく追加されているのはもちろん、イレギュラーな値が入り元のデータ型では扱えなくなったIS_EXPRESS_DELIVERY
列とTOTAL_PRICE
列がVARCHAR(256)
になっているのがわかります。
このように、新しい列が追加されても問題なく対応し、データの内容が変わった場合でも自動でデータ型を変更してくれるのがFivetranの魅力的なところだと思います!
最後に
Fivetranによる自動データ型割当・自動データ型変換の挙動を確かめてみました。
普段自分でデータロード処理を開発して運用している方にとっては、とてもありがたく感じる機能ではないでしょうか。参考になると幸いです。