はじめに
DomoのMagic ETLに大規模なアップグレードが実施されました。データ処理エンジンが大幅にアップグレードされ、ほとんどのDataFlowが大変迅速かつ効率的に実行できるようになりました。さらに、新しいタイルと機能が追加されたことで、Magic ETLを使ったデータ変換を最大限に活用できるようになりました。 この記事では、Magic ETLをアップグレードする前に知っておくべき重要な 主な動作の変更点 と新機能について説明します。 アップデートされた機能は、4つの主要カテゴリーに分かれています。- パフォーマンス
- 新規/更新されたタイル
- ユーザーインターフェース
-
高度なオプション
アップグレードすべき理由
今回目指したのは、Magic ETLの内部構造の一貫性や、Beast ModeなどのほかのDomoの機能との整合性を高めることでした。私たちの目標の1つは、競合する列名を解決する際に、ユーザーによるマニュアル入力とMagic ETLによる自動入力という2つのメソッドを提供することでした。行名の競合はJoinと[行を追加]のどちらでも処理されますが、Magic ETLはこれらを異なる方法で処理するようになります。この変更については、多くのお客様から「データをきれいに保つために重要」との声が寄せられていました。 自動リネーム機能の見直しは、ほんの一例にすぎません。Magic ETLは、Domo Beast Mode、SQLデータベース、スプレッドシートなど様々なソフトウェアに着目して開発された、200以上の機能を持つ新しいスクリプトシステムを備えています。スクリプトにより、Magic ETLは大きく革新されました。スクリプトシステムによって提供される機能は、従来の設定のタイルのクラスターをより簡潔に表現するだけではありません。時には、MySQL DataFlowを超える性能を発揮することもあります。スクリプトを使用して、列を所定の位置で編集したり、新しい列を追加したりすることができ、また、 [グループ化] タイルや [行をフィルター] タイルの一部として使用して、複雑な集計条件やフィルター条件を作成することができます。詳細については、「 Magic ETLでスクリプトを書き込む 」を参照してください。 新しいスクリプトシステムでサポートされ、利用可能な関数の完全なリストは、「 Magic ETLでサポートされている関数 」を参照してください。主な動作の変更点
Magic ETLに加えられた変更によって、変換の動作が変わる場合があります。そのため「列が見つかりません」や「重複した列名」などのエラーが発生したり、微妙に異なるデータが出力されることがあります。混乱を避けるため、既存のDataFlowをMagic ETL v2へ移行するときや、Magic ETLで新規DataFlowを作成するときには、あらかじめ動作の違いを把握しておくことが重要です。行をフィルター
NULL値は、比較関数によって異なる方法で処理されます。SQLおよびMagic ETL v2のDataFlowでは、nullとの比較の結果は常にnullとなり、 [行をフィルター] タイルでは誤った結果として扱われます。Magic ETL v2ではほとんどの場合、「nullはnullと等しくない」は同時に「nullはnullと等しくなくはない」、「nullは0以上ではない」も同様に「nullは0以下ではない」、「nullは0と等しくない」ともみなされます。 [行をフィルター] タイルが参照する列にnullがある場合、関数や引数に関係なく、それらの行はすべてドロップされます。nullを適切に処理できる関数は、「is null」と「is not null」のみです。Magic ETL v1では、フィルターが「column = null」のテストを実行することもありました。このような場合は今後、同じ結果を得られないため、このようなフィルターは「is null」演算子を使用するように変更する必要があります。 フローをMagic ETLからMagic ETL v2に切り替えた後、正常に実行されていても出力に行が欠落しているよう場合は、この変更が原因であると考えられます。「is not equal to」関数を使用するときには特に注意する必要があります。「column <> 5」は、列の値が5の行のみをドロップするように見えるかもしれませんが、実際には、上記の理由により、列にnullを含む行もドロップします。次の表に、 [行をフィルター] でのnullの動作の追加の例を示します。
より複雑な方法でnullを処理するには、新しいスクリプトシステムを使用します。 [行をフィルター] タイルは、スクリプトの評価をサポートする3つのタイル( [グループ化] と [スクリプトを追加] がほかの2つ)の1つです。IFNULL()関数は、フィルター式からnull結果を処理する場合に特に適しています。例えば、列「col」にnull値があり、「col」の値が5でない行をフィルターしてnullを保持する場合は、次の式を記述できます:IFNULL(col <> 5, TRUE) null処理のほかにも、フィルタースクリプトによって簡単になるシナリオは多数あります。Magic ETL v1では、以下の1つのスクリプトで、それぞれ複数の条件を持つ2つの個別の [行をフィルター] タイルが必要でした。テスト
評価済みの結果
フィルターの効果
4 <> 5
true
保持
5 <> 5
false
ドロップ
null <> 5
null
ドロップ
null = null
null
ドロップ
null <> null
null
ドロップ
null is null
true
保持
null is not null
false
ドロップ
5 is not null
true
保持
5 is null
false
ドロップ
日付と時刻の解析
入力テキストを「日付」または「日付と時刻」の値に変換処理するための、日付と時刻の解析が大幅に変更されました。全般的に、これまでより厳密になりました。Magic ETL v1では正常に解析できたテキストでも、Magic ETL v2ではエラーになるものがあります。より厳密になった理由は、月と日を混同してしまうなど、値が気付かないところで間違って解釈されてしまうのを避けるためです。Magic ETLは、正確な日付と時刻の形式の固定リストと、各国特有の多様な形式のリストを使用します(例:米国では「01/02/2020」は1月2日、その他のほとんどの国や地域では2月1日)。Magic ETLが日付を解析できない場合は、列単位で [入力DataSet] タイルにカスタムフォーマットを指定できます。フォーマットの仕様については、 Java Date TimeFormatterクラスに関するOracleのドキュメント を参照してください。日付と時刻の演算
Magic ETLでは、Domoの管理メニューで指定された会社のタイムゾーンをデフォルトとして日付と時刻の演算を実行します。Magic ETL v1では、日付と時刻の演算は、世界的標準時間である協定世界時(UTC)で実行していました。例えば、企業の所在地のタイムゾーンがアメリカ/デンバーで、日付と時刻の列で「日付の月」を使用している場合、協定世界時(UTC)ではなくデンバーのタイムスタンプを取得します。 [日付の演算]タイルのThe WEEK_OF_YEAR()関数も変更されました。日曜日を含む週が、その年の第1週目となります。ここが従来とは異なる点で、旧バージョンのMagic ETLとBeast Modeでは曜日にかかわらず、その年の最初の週が第1週となります。 週番号の表示は [スクリプトを追加] タイルで調整できます。week()関数の2番目の引数(0から7までの整数で「週モード」を表す)で週番号を計算できます。これらのモードについては OracleのMySQLドキュメント で説明されており、Beast Modeもそれに準拠して動作します。Mode 0(またはmode引数なしのweek())は、 [日付の演算] タイルのweek_of_year()関数と同じ結果を返します。Join
[データを結合] タイルには大きな変更が2つあります。- 重複する結合キー数の少ないテーブルをLeft Joinにすることは重要ではなくなりました。Magic ETLでは重複エラーが発生して「左の入力には、10,000を超える重複が存在することはできません。」というエラーメッセージが表示されましたが、この問題が修正されました。
- 名前の競合は、ユーザーによる入力がないと解決できなくなりました。その代わり、 [データを結合] タイルに名前の競合を解決するための設定を行うセクションが追加されました。このセクションへは、自動または手動で入力できます。競合する列名の変更に加えて、 [データを結合] タイルの設定で列を削除することもできるようになりました。
行を追加(Union)
これまでは、 [行を追加] タイルに入る2つ以上の列の名前が同じでも、データタイプが異なる場合、それらは結合されませんでした。その代わりに、「ID整数」や「IDテキスト」のような名前で2つ以上の新しい列が作成されていました。アップデート後は、 [行を追加] タイルで列名が変更されることはありません。タイプが異なる列の場合、同じ列名を持つすべての列のデータに対して、可能な限り最適なタイプへの変換が行われます。例えば、ある列のタイプが「整数」で、別の列のタイプが「小数」の場合、列は「小数」タイプの列に結合されます。日付と小数のようにタイプが完全に互換性のない場合、結果の列はテキストタイプになります。この動作は、 [行を追加] タイル設定の新しいオプションを使用して、より厳密な動作に置き換えることができます。より厳密な動作では、同じ名前を持つ2つの列で、列のタイプが異なる場合にはエラー(実行に失敗)となります。その他の検討事項
Magic ETLにおける動作の変更点だけでなく、追加された変換機能について理解することも有益です。以前のバージョンのMagic ETLをよくご存じであれば、ぜひ以下をお試しください。- 新しい [スクリプトを追加] タイル ― 新しい[スクリプトを追加]タイルは200以上の関数をサポートしており、そのほとんどは新しいMagic ETL独自の関数です。初めて [スクリプトを追加] を使用する場合は、スクリプトエディターを展開して関数リストを参照してください。
- [入力DataSet] タイル ― 入力される列のタイプの変更、エラーやnullの処理方法の設定ができるようになりました。テキスト列のすべてのnullを空白の文字列として解釈することも可能です。
- 新しい [動的アンピボット] タイル ― 一部のシナリオでは、従来の[アンピボット]( [列を折りたたむ] )タイルよりも合理的に動作します。ほとんどの列をそのまま残して一部の列のみをピボットするのではなく、一部の列を除くすべての列をピボットする場合は、この新しいタイルを使用することを推奨します。
機能のアップデート
パフォーマンス
実行時間を短縮 Magic ETLのパフォーマンスは、以前のバージョンよりも大幅に向上しました。各DataFlowのパフォーマンスの変化はそれぞれ異なりますが、多くのDataFlowは、新しいバージョンにアップグレードするだけで大幅に動作が速くなります。この方法の詳細については、「 Magic ETLをアップグレードする 」を参照してください。また、Magic ETLのパフォーマンスが、多くのMySQLやRedShiftのDataFlowをたびたび上回ることも確認されています。