> ## Documentation Index
> Fetch the complete documentation index at: https://domoinc-openapi-sync-dataflows.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Magic ETLの動作変更と機能のアップデート

## はじめに

DomoのMagic ETLに大規模なアップグレードが実施されました。データ処理エンジンが大幅にアップグレードされ、ほとんどのDataFlowが大変迅速かつ効率的に実行できるようになりました。さらに、新しいタイルと機能が追加されたことで、Magic ETLを使ったデータ変換を最大限に活用できるようになりました。

この記事では、Magic ETLをアップグレードする前に知っておくべき重要な [主な動作の変更点](#notable-behavior-changes) と新機能について説明します。

アップデートされた機能は、4つの主要カテゴリーに分かれています。

* [パフォーマンス](#h_01FG1ZYHHMNDRJK1DRCJ57VGSB)
* [新規/更新されたタイル](#h_01FG1ZYS1QA8D98ZG02DK0NP49)
* [ユーザーインターフェース](#h_01FG1ZZ3SW8X9GSA06JNVAHVRF)
* [高度なオプション](#h_01FG1ZZQCQNFC8Z0ANJ9HXRGAP)

  ## アップグレードすべき理由

  今回目指したのは、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でスクリプトを書き込む](/s/article/360044258533) 」を参照してください。

  新しいスクリプトシステムでサポートされ、利用可能な関数の完全なリストは、「 [Magic ETLでサポートされている関数](/s/article/360044289573) 」を参照してください。

  ## 主な動作の変更点

  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の動作の追加の例を示します。

  <table class="mt-responsive-table" data-aura-rendered-by="33:204;a"><thead><tr><th class="mt-column-width-15" colspan="1" rowspan="1"><p> テスト </p></th><th class="mt-column-width-35" colspan="1" rowspan="1"><p> 評価済みの結果 </p></th><th class="mt-column-width-20" colspan="1" rowspan="1"><p> フィルターの効果 </p></th></tr></thead><tbody><tr><td colspan="1" rowspan="1"><p> 4 \<> 5 </p></td><td colspan="1" rowspan="1"><p> true </p></td><td colspan="1" rowspan="1"><p> 保持 </p></td></tr><tr><td colspan="1" rowspan="1"><p> 5 \<> 5 </p></td><td colspan="1" rowspan="1"><p> false </p></td><td colspan="1" rowspan="1"><p> ドロップ </p></td></tr><tr><td colspan="1" rowspan="1"><p> null \<> 5 </p></td><td colspan="1" rowspan="1"><p> null </p></td><td colspan="1" rowspan="1"><p> ドロップ </p></td></tr><tr><td colspan="1" rowspan="1"><p> null = null </p></td><td colspan="1" rowspan="1"><p> null </p></td><td colspan="1" rowspan="1"><p> ドロップ </p></td></tr><tr><td colspan="1" rowspan="1"><p> null \<> null </p></td><td colspan="1" rowspan="1"><p> null </p></td><td colspan="1" rowspan="1"><p> ドロップ </p></td></tr><tr><td colspan="1" rowspan="1"><p> null is null </p></td><td colspan="1" rowspan="1"><p> true </p></td><td colspan="1" rowspan="1"><p> 保持 </p></td></tr><tr><td colspan="1" rowspan="1"><p> null is not null </p></td><td colspan="1" rowspan="1"><p> false </p></td><td colspan="1" rowspan="1"><p> ドロップ </p></td></tr><tr><td colspan="1" rowspan="1"><p> 5 is not null </p></td><td colspan="1" rowspan="1"><p> true </p></td><td colspan="1" rowspan="1"><p> 保持 </p></td></tr><tr><td colspan="1" rowspan="1"><p> 5 is null </p></td><td colspan="1" rowspan="1"><p> false </p></td><td colspan="1" rowspan="1"><p> ドロップ </p></td></tr></tbody></table>

  より複雑な方法でnullを処理するには、新しいスクリプトシステムを使用します。 **［行をフィルター］** タイルは、スクリプトの評価をサポートする3つのタイル（ **［グループ化］** と **［スクリプトを追加］** がほかの2つ）の1つです。IFNULL()関数は、フィルター式からnull結果を処理する場合に特に適しています。例えば、列「col」にnull値があり、「col」の値が5でない行をフィルターしてnullを保持する場合は、次の式を記述できます：IFNULL(col \<> 5, TRUE)

  null処理のほかにも、フィルタースクリプトによって簡単になるシナリオは多数あります。Magic ETL v1では、以下の1つのスクリプトで、それぞれ複数の条件を持つ2つの個別の **［行をフィルター］** タイルが必要でした。

  #### 日付と時刻の解析

  入力テキストを「日付」または「日付と時刻」の値に変換処理するための、日付と時刻の解析が大幅に変更されました。全般的に、これまでより厳密になりました。Magic ETL v1では正常に解析できたテキストでも、Magic ETL v2ではエラーになるものがあります。より厳密になった理由は、月と日を混同してしまうなど、値が気付かないところで間違って解釈されてしまうのを避けるためです。Magic ETLは、正確な日付と時刻の形式の固定リストと、各国特有の多様な形式のリストを使用します（例：米国では「01/02/2020」は1月2日、その他のほとんどの国や地域では2月1日）。Magic ETLが日付を解析できない場合は、列単位で **［入力DataSet］** タイルにカスタムフォーマットを指定できます。フォーマットの仕様については、 [Java Date TimeFormatterクラスに関するOracleのドキュメント](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html) を参照してください。

  #### 日付と時刻の演算

  Magic ETLでは、Domoの管理メニューで指定された会社のタイムゾーンをデフォルトとして日付と時刻の演算を実行します。Magic ETL v1では、日付と時刻の演算は、世界的標準時間である協定世界時（UTC）で実行していました。例えば、企業の所在地のタイムゾーンがアメリカ/デンバーで、日付と時刻の列で「日付の月」を使用している場合、協定世界時（UTC）ではなくデンバーのタイムスタンプを取得します。

  ［日付の演算］タイルのThe WEEK\_OF\_YEAR()関数も変更されました。日曜日を含む週が、その年の第1週目となります。ここが従来とは異なる点で、旧バージョンのMagic ETLとBeast Modeでは曜日にかかわらず、その年の最初の週が第1週となります。

  週番号の表示は **［スクリプトを追加］** タイルで調整できます。week()関数の2番目の引数（0から7までの整数で「週モード」を表す）で週番号を計算できます。これらのモードについては [OracleのMySQLドキュメント](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/date-and-time-functions.html#function_week) で説明されており、Beast Modeもそれに準拠して動作します。Mode 0（またはmode引数なしのweek()）は、 **［日付の演算］** タイルのweek\_of\_year()関数と同じ結果を返します。

  #### Join

  **［データを結合］** タイルには大きな変更が2つあります。

  1. 重複する結合キー数の少ないテーブルをLeft Joinにすることは重要ではなくなりました。Magic ETLでは重複エラーが発生して「左の入力には、10,000を超える重複が存在することはできません。」というエラーメッセージが表示されましたが、この問題が修正されました。
  2. 名前の競合は、ユーザーによる入力がないと解決できなくなりました。その代わり、
     **［データを結合］** タイルに名前の競合を解決するための設定を行うセクションが追加されました。このセクションへは、自動または手動で入力できます。競合する列名の変更に加えて、 **［データを結合］** タイルの設定で列を削除することもできるようになりました。

  #### 行を追加（Union）

  これまでは、 **［行を追加］** タイルに入る2つ以上の列の名前が同じでも、データタイプが異なる場合、それらは結合されませんでした。その代わりに、「ID整数」や「IDテキスト」のような名前で2つ以上の新しい列が作成されていました。アップデート後は、 **［行を追加］** タイルで列名が変更されることはありません。タイプが異なる列の場合、同じ列名を持つすべての列のデータに対して、可能な限り最適なタイプへの変換が行われます。例えば、ある列のタイプが「整数」で、別の列のタイプが「小数」の場合、列は「小数」タイプの列に結合されます。日付と小数のようにタイプが完全に互換性のない場合、結果の列はテキストタイプになります。この動作は、 **［行を追加］** タイル設定の新しいオプションを使用して、より厳密な動作に置き換えることができます。より厳密な動作では、同じ名前を持つ2つの列で、列のタイプが異なる場合にはエラー（実行に失敗）となります。

  #### その他の検討事項

  Magic ETLにおける動作の変更点だけでなく、追加された変換機能について理解することも有益です。以前のバージョンのMagic ETLをよくご存じであれば、ぜひ以下をお試しください。

  * 新しい
    **［スクリプトを追加］** タイル ― 新しい［スクリプトを追加］タイルは200以上の関数をサポートしており、そのほとんどは新しいMagic ETL独自の関数です。初めて **［スクリプトを追加］** を使用する場合は、スクリプトエディターを展開して関数リストを参照してください。
  * **［入力DataSet］**
    タイル ― 入力される列のタイプの変更、エラーやnullの処理方法の設定ができるようになりました。テキスト列のすべてのnullを空白の文字列として解釈することも可能です。
  * 新しい
    **［動的アンピボット］** タイル ― 一部のシナリオでは、従来の［アンピボット］（ **［列を折りたたむ］** ）タイルよりも合理的に動作します。ほとんどの列をそのまま残して一部の列のみをピボットするのではなく、一部の列を除くすべての列をピボットする場合は、この新しいタイルを使用することを推奨します。

  この動画では、動作の変更点について詳しく説明しています。

  **動画 - Magic ETLをアップグレードする**

  <iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="//www.youtube-nocookie.com/embed/fSQCz1SbuGg" width="560" />

  ## 機能のアップデート

  #### パフォーマンス

  **実行時間を短縮**

  Magic ETLのパフォーマンスは、以前のバージョンよりも大幅に向上しました。各DataFlowのパフォーマンスの変化はそれぞれ異なりますが、多くのDataFlowは、新しいバージョンにアップグレードするだけで大幅に動作が速くなります。この方法の詳細については、「 [Magic ETLをアップグレードする](/s/article/4408794063639) 」を参照してください。また、Magic ETLのパフォーマンスが、多くのMySQLやRedShiftのDataFlowをたびたび上回ることも確認されています。

  <Warning>
    **重要：** DataFlowをMagic ETL v1に戻す場合、Magic ETL v2での動作変更にご注意ください。
  </Warning>

**入力としてDataSetビューを表示**

DataSetビューをMagic ETLで入力として使用できるようになりました。これにより、列のフィルター、集計、名前変更、ドロップが簡単になり、Magic ETLにデータを取り込む前にBeast Mode関数を実行することができます。データをMagic ETLに取り込む前に不要なすべての行をフィルターすると、実行時間を短縮することができます。

**処理を追加**

従来のMagic ETLにおける制限の1つは、実行中の変換に不要なデータであっても、DataFlowを実行するたびにエンジンが入力DataSetのデータをすべて読み込むということです。アップデート後は、各実行の開始時にDataFlowの入出力の状態がシステムによって確認されます。可能な場合は、最後のDataFlowの実行以降に入力に追加された新しい行のみが処理されます。これらの行は自動で出力DataSetに追加されます。結果的に出力データはまったく同じになりますが、実行時間が大幅に短縮されます。この最適化について詳しくは、「 [新しいMagic ETL DataFlowの自動追加処理](/s/article/360051062653) 」を参照してください。

#### 新規/更新されたタイル

**新規タイル**

スクリプトを追加

SQLを頻繁に使用しているユーザーの場合、従来のMagic ETLに移行すると使いにくく感じられることがありました。1行のMySQLコードで済むことが、従来のMagic ETLでは15回以上マウスをクリックしなければならないことがあります。こうした不満は、［スクリプトを追加］タイルで解消されます。［スクリプトを追加］タイルは行ごとの式エバリュエーターで、これによりMagic ETLのDataFlowにSQLスタイルの構文を直接書き込むことができます。複合式で列の作成や修正が可能です。この新しいタイルでは、CASEステートメント、統計ユーティリティー関数、およびtime-value-money演算すべてを簡単に実行することができます。

列を変更

［列を変更］タイルは、［列のタイプを設定］タイルのアップグレード版です。1つのシンプルなタイルで、列のデータタイプの名前変更、削除、変更を簡単に行えるようになりました。

動的アンピボット

この新しいタイルは、［アンピボット］タイルの反対です。入力DataSet上のスキーマが変更されることを想定している場合、［動的アンピボット］タイルを使用すると、新規行に指定された列を除くすべての列データをピボットして、テーブルを絞り込むことができます。設定で除外された列は、行の値になります。

**更新されたタイル**

グループ化

［スクリプト］タイルを使用する際に考慮すべき重要な違いは、「実行しようとしている変換のタイプは何か？」ということです。変換タイプに集計が含まれている場合は、スクリプトサポートを伴うSQLスタイル式をサポートしている［グループ化］タイルを使用する必要があります。［スクリプトを追加］タイルは、集計をサポートしていない行ごとの操作を実行します。SUMやMEDIAN、PERCENTILEなどの操作を使用する場合は、必ず［グループ化］タイルを選択してデータを集計してください。

行をフィルター

［行をフィルター］タイルは、SQLスタイルの式もサポートするようになりました。従来は、複合フィルターステートメントを実行するのに何度もマウスをクリックする必要がありました。アップデートされたMagic ETLでは、この式エバリュエーターにより、複雑なフィルタールールをすばやく設定することができます。フィルタースクリプトの書き込み方法について詳しくは、「 [Magic ETLでフィルタースクリプトに書き込む方法](/s/article/360044296573) 」を参照してください。

ピボットおよびアンピボット

以前の［列を展開］タイルは［ピボット］タイルになりました。以前の［列を折りたたむ］タイルは［アンピボット］タイルになりました。

データを結合

従来は、データをJoinする際、列名の競合は処理するのが困難でした。現在は、［データを結合］タイルを使って、重複した列名が発生したときにどのように処理するかを簡単に指定できます。列名の競合解消オプションと列のドロップオプションにより、［データを結合］タイルの実行はかつてないほど簡単になりました。

PythonとRのスクリプト

スクリプトタイルの柔軟性がより高くなりました。出力DataSetにスキーマを指定できるようになりました。スクリプトを実行すると、出力DataSetに必要なスキーマが提供され、時間を節約できます。プレビューを実行してスキーマを生成したり、ダウンストリームタイルの一部として必要な場合にスキーマを指定することができます。

#### ユーザーインターフェース

**カラーコード化された曲線**

従来、複雑なETLは、グラフを見るだけでは把握するのが困難でした。現在、カラーコード化された曲線では、デフォルトでデータソースごとに線が色分けされるようになりました。これにより、変換の流れをすばやく把握することができます。デフォルトの色を変更したい場合は、カラーピッカーを使って変更することができます。

**タイルに関する注記**

作成した覚えのない、あるいは何ヶ月もの間放置された、複雑なMagic ETL DataFlowに遭遇したことがありますか？それらのDataFlowは、どのような変換が行われているか解読したり、存在理由自体を突き止めることすら難しい可能性があります。個々のタイルに注釈機能を付けることで、DataFlowが各タイルで実行している内容について詳細な説明を書き込むことができます。

**新しいタイルのカテゴリー化**

古いMagic ETLでは、ドロップダウンカテゴリーが［DataSet］、［列を編集］、［データを編集］、［データを結合］に限られていたため、必要なタイルを見つけることは容易ではありませんでした。新しいMagic ETLでは、［テキスト］、［日付と数値］、［ユーティリティー］、［フィルター］、［データを結合］、［集計する］、［ピボット］という、より詳細なカテゴリーが用意されています。タイルのツールチップも、それぞれのタイルの最新情報を反映するように更新されました。

**データプレビューでテキストを選択**

Magic ETL DataFlowでは、選択可能なテキストでプレビューデータに簡単にアクセスできます。［プレビュー］または［データ］タブにある個々のセルまたはセルのグループをすばやくコピーして貼り付けることができるようになりました。

#### 高度なオプション

**データタイプの処理に関する拡張**

スクリプトを含めることで、Magic ETLはより汎用的なツールになりました。この新機能は、DataSetの初期ロード時だけでなくDataFlow全体に対して、データタイプの処理を確実に設定できるようにするというニーズに応えたものです。列がどのデータタイプであるべきか、そして予定されているフォーマットとそのデータタイプでデータが読み取り不可な場合の処理を簡単に指定することができます。

**入力DataSetタイルのプレビューとデータ表**

入力時におけるデータタイプの分類が追加されたため、入力DataSetタイルに新しいプレビュータブを導入しました。新しいプレビュータブでは、データタブの未加工データや構成済みの変換設定ごとのデータ変化を簡単に確認できます。

**DataFlow変換設定**

Magic ETLでは、タイムゾーン、ロケール、照合順序モードの処理、およびDataFlowのデフォルトの日付とタイムスタンプフォーマットの指定を行うことができます。これはタイルをどのタイムゾーンで実行するかを指定する必要がある場合に、DataFlowレベルおよび個々のタイルレベルでアクセスできます。

日本語
