Snowflake Data Cloudでのトランスフォーメーション SQL ELTの最適化を設定すると、データ統合は、設定済みのトランスフォーメーションをSnowflakeにプッシュしようとします。
完全なSQL ELTを使用して、次のようなトランスフォーメーションをSnowflakeにプッシュすることができます。
• アグリゲータ• 式• フィルタ• 階層プロセッサ• ジョイナ• ルックアップ• ノーマライザ• ランク• ルータ• シーケンスジェネレータ• SQL* • ソータ• 共有体• アップデートストラテジ* *詳細モードのマッピングには適用されません。
注: ルータートランスフォーメーションはソースSQL ELTにのみ適用することができ、階層プロセッサトランスフォーメーションは詳細モードのマッピングにのみ適用することができます。
トランスフォーメーションの設定に関する詳細については、データ統合のドキュメントにある「トランスフォーメーション 」を参照してください。
アグリゲータトランスフォーメーション 完全なSQL ELTの最適化を設定して、Snowflakeで処理するアグリゲータトランスフォーメーションをプッシュできます。
集計計算 次の集計計算を実行できます。
• AVG• COUNT• MAX• MIN• MEDIAN• SUM• VARIANCE受信ポート アグリゲータトランスフォーメーションを設定し、受信ポートが集計関数またはマッピングのグループ化フィールドで使用されていない場合、グループ化または集計関数の一部ではないカラムに対してANY_VALUE()関数が使用されます。この場合、ANY_VALUE()関数はポートから任意の値を返すため、出力は確定的ではありません。ただし、詳細モードでは、受信ポートがグループ化フィールドの一部でない場合、MAX()関数が使用されます。また、アグリゲータトランスフォーメーションにより、値が1の追加のカラムが生成されます。ただし、このカラムはSQL ELTクエリの挿入部分では削除されるため、使用されません。
式トランスフォーメーション 完全なSQL ELTの最適化を設定して、Snowflakeで処理する式トランスフォーメーションをプッシュできます。
マッピング内の各ソースに式トランスフォーメーションを追加してから、マッピング内のダウンストリームに結合することができます。さらに、トランスフォーメーションから分岐してから、マッピングのダウンストリームのトランスフォーメーションに分岐する複数の式トランスフォーメーションを追加できます。
式トランスフォーメーションを設定するときは、次のルールを考慮して、変数を式に含めてください。
• 前の行の処理中に割り当てられた値を現在の行の計算に使用している場合、変数を使用することはできません。この場合、マッピングはSQL ELTの最適化を使用せずに実行されます。• 変数はネストできますが、式で定義する前に変数を参照することはできません。変数がこの順序で定義されていない場合、マッピングはSQL ELTの最適化を使用せずに実行されます。
例:
var: AGEPLUS2 = AGEPLUS1 + 1 var: AGEPLUS1 = AGE + 1 out: NEXTAGE = AGEPLUS2 + 1
ここで、AGE +1は後で定義されます。最初の変数のAGEPLUS2はAGEPLUS1を参照しており、未解決のままです。
これを解決するには、次の順序で変数を指定します。
var: AGEPLUS1 = AGE + 1 var: AGEPLUS2 = AGEPLUS1 + 1 out: NEXTAGE = AGEPLUS2 + 1
• 変数は、循環型の式またはそれ自体を参照する式を持つことはできません。例:
var: AGEPLUS1 = AGEPLUS2 + 1 var: AGEPLUS2 = AGEPLUS1 + 1 out: NEXTAGE= AGEPLUS2
ここで、AGEPLUS1はAGEPLUS2を参照し、未解決のままです。
階層プロセッサトランスフォーメーション 詳細モードでは、Amazon S3 V2またはMicrosoft Azure Data Lake Storage Gen2ソースから階層入力またはリレーショナル入力を読み取り、リレーショナルまたは階層出力としてSnowflakeターゲットに書き込むように階層プロセッサトランスフォーメーションを設定できます。
階層プロセッサトランスフォーメーションは、構造または配列を表す階層フィールドを処理します。
次のような制限付きで階層プロセッサトランスフォーメーションを設定できます。
• 階層出力フィールドの配列要素に固定小数点数値データ型が含まれている場合、マッピングはSQL ELTの最適化を使用せずに実行されます。 • Doubleデータ型の10進数値は指数で表記されます。例えば、Doubleデータ型の2341.6789をSnowflakeターゲットの出力フィールドに書き込むと、出力は2.341678900000000e+03と表示されます。
• [入力グループまたは受信フィールドの使用] をデータソースとして選択し、複数の行を含むソースから階層入力またはリレーショナル入力を読み取り、階層出力としてSnowflakeターゲットに書き込む場合、データ統合は行ごとにレコードを複製します。重複した行がターゲットに書き込まれることを避けるには、[親のデータソースの継承] を選択するか、フィルタ条件を使用してデータソースから子フィールドをフィルタリングします。
• Integerデータ型またはBigintデータ型を構造フィールドからSnowflakeターゲットに書き込むには、[セッションプロパティ名] リストから[advanced.custom.property] を選択し、マッピングタスクに次の値を入力します。DisableAdvancedMappingRuntimeValidation=true
• マルチレベルの構造体フィールドを含むAvroまたはParquetファイルからSnowflakeターゲットにデータの書き込みを行うことはできません。 ルックアップトランスフォーメーション 完全なSQL ELTの最適化を設定して、ルックアップトランスフォーメーションをプッシュし、Snowflakeで処理できます。接続済みのルックアップおよび未接続のルックアップをプッシュできます。
マッピングに未接続のルックアップが含まれている場合は、未接続のルックアップ関数を他の式関数とネストすることもできます。例えば、:LKP.U_LOOKUP(Upper(argument1), argument) のようにすることができます。
ルックアップオブジェクト ルックアップを設定するときは、次のルールを考慮してください。
• ソーストランスフォーメーションが次のソースを使用する場合、Snowflakeのルックアップを設定できます。- Amazon S3- Google Cloud Storage* - Microsoft Azure Data Lake Storage Gen2- Snowflakeソース*詳細モードのマッピングには適用されません。
• 対応するAmazon S3、Google Cloud Storage、Microsoft Azure Data Lake Storage Gen2、またはSnowflakeソースをソーストランスフォーメーションが使用している場合にのみ、Amazon S3、Google Cloud Storage、Microsoft Azure Data Lake Storage Gen2、またはSnowflakeオブジェクトにルックアップを設定できます。接続済みのルックアップ Snowflake Data Cloudのソースとターゲットを使用したマッピングで、ルックアップオブジェクトの[複数一致] オプションを[すべての行を返す] に設定します。
未接続のルックアップ 接続されていないルックアップトランスフォーメーションを設定する場合は、次のルールを考慮してください。
• 未接続のルックアップから受信した出力には式を設定しないでください。• 接続されていないルックアップトランスフォーメーションからの入力フィールドの一部がSnowflakeターゲットオブジェクトにマッピングされていないSnowflake Data Cloudソースとターゲットを使用したマッピングでは、選択クエリにマッピングされていないすべてのフィールドが含まれます。 接続されたルックアップと未接続のルックアップでの複数一致の動作 接続済みのルックアップまたは未接続のルックアップを含むマッピングに対してSQL ELTの最適化を有効にする場合は、次のガイドラインに従う必要があります。
• 未接続のルックアップでは、[複数一致] オプションを必ず[エラーを報告] に選択してください。データを検索して、検索条件で複数の一致が見つかった場合は、一致するすべての行が選択され、SQL ELTの最適化を使用してタスクが実行されます。[エラーを報告] 以外のオプションに対して[複数一致] を有効にした場合、マッピングはSQL ELTの最適化を使用せずに実行されます。• 接続済みのルックアップでは、[複数一致] オプションを[すべての行を返す] または[エラーを報告] に設定します。[複数一致] オプションを[エラーを報告] に設定すると、タスクの詳細セッションプロパティでLkp_apdo_allow_report_error カスタムフラグを設定して、データ統合が複数の一致を処理する方法を決定できます。- このプロパティを[はい] に設定し、データ内に複数の一致がある場合、複数一致ポリシーは無視され、ジョブはSQL ELTの最適化を使用して正常に実行されます。- このプロパティを設定せず、データ内に複数の一致がある場合、データ統合はポリシーを考慮して警告メッセージを表示します。SQL ELTの最適化は無視され、タスクは失敗します。FileNameポート Amazon S3ソースとSnowflakeターゲットを含むマッピングでAmazon S3ソースのルックアップを設定した場合は、Amazon S3ソースおよびルックアップオブジェクトからFileNameポートを削除します。FileNameポートは使用できません。
ルックアップクエリオブジェクト Snowflakeのデータをルックアップするためのマッピングでルックアップトランスフォーメーションのクエリとしてルックアップオブジェクトを使用する場合は、詳細ルックアッププロパティまたはSnowflake Data Cloud接続の追加のJDBC URLパラメータでデータベースとスキーマを指定する必要があります。
ノーマライザトランスフォーメーション 複数回発生するデータのインスタンスごとに行を返すように、マッピングでノーマライザトランスフォーメーションを設定できます。
例えば、リレーショナルソースに、四半期の売上データが格納された4つのフィールドがあるとします。この場合、四半期ごとに別個の出力行を生成するように、ノーマライザトランスフォーメーションを設定することができます。
詳細モードでは、次のような制限付きでノーマライザトランスフォーメーションを設定できます。
• 異なるグループから複数回発生するフィールドを正規化するには、各グループを一意のターゲットにマッピングし、グループがターゲットにマッピングされていない場合でも、異なるグループからのすべてのフィールドを受信フィールドのリストから除外します。• 正規化されたデータを複数のターゲットに書き込むには、正規化されたフィールドの生成されたすべてのカラムIDを対応するターゲットにマッピングします。ルータートランスフォーメーション ソースSQL ELTの最適化を設定して、ルータートランスフォーメーションをデータベースにプッシュして処理することができます。
ルータートランスフォーメーションを設定する場合は、1つの出力グループのみをターゲットトランスフォーメーションに接続またはマッピングします。
シーケンスジェネレータトランスフォーメーション シーケンスジェネレータトランスフォーメーションを設定すると、シーケンスジェネレータトランスフォーメーションに続くトランスフォーメーションでNEXTVALポートを単一または複数のポートに接続できます。
次のような制限付きで、シーケンスジェネレータトランスフォーメーションをプッシュできます。
• シーケンスジェネレータトランスフォーメーションで共有シーケンスを使用することはできません。• マッピング内のシーケンスジェネレータトランスフォーメーションの後に追加できるのは、式またはターゲットトランスフォーメーションのみです。詳細モードおよびSQL ELTモードのマッピングでシーケンスジェネレータトランスフォーメーションを使用するためのガイドライン 詳細モードおよびSQL ELTモードでのシーケンスジェネレータトランスフォーメーションは、マッピングの同じルールに従います。ただし、詳細モードおよびSQL ELTモードのマッピングでシーケンスジェネレータトランスフォーメーションを使用するには、Snowflakeのシーケンスの名前を使用して、マッピングタスクプロパティに追加のプロパティを設定する必要があります。
1 タスクプロパティの[ランタイムオプション] タブで、[詳細セッションプロパティ] セクションに移動します。2 カスタムプロパティを追加し、次のセッションプロパティ値を次の形式で入力します。Pushdown.<Sequence transformation name in mapping>.SequenceName=<sequence name to create in Snowflake>
例: Pushdown.Seq_SF.SequenceName=snowflake_first_sequence&:Pushdown.sequence_second.SequenceName=SECOND_SEQUENCE&:Pushdown.seq_third.SequenceName=THIRD_SEQ
複数のシーケンスジェネレータトランスフォーメーションを使用する場合、シーケンスごとにSnowflakeデータベースに作成されるシーケンスオブジェクトの名前は一意である必要があります。名前が一意でない場合、トランスフォーメーションはCREATE SEQUENCE IF NOT EXISTSクエリで同じ名前を使用して2回実行されます。最初のシーケンスは想定どおりに実行されますが、最初のシーケンスと同じ名前を持つ2番目のシーケンスによって最初のシーケンスがオーバーライドされることはありません。したがって、2番目のシーケンスに生成されるnextValueは誤った値となります。ただし、シーケンスオブジェクトに対して一意の名前を使用してシーケンスを実行した場合、マッピングを実行する回数に関係なく、そのシーケンスが再度更新されることはありません。
注: SQL ELTの最適化を無効にしてマッピングを実行すると、シーケンス値は最初の開始値から再開されます。マッピングを削除した場合は、Snowflakeデータベースからもシーケンスを削除する必要があります。
SQLトランスフォーメーション SQLトランスフォーメーションは、特定の関数と共有シーケンスをプッシュするためにのみ使用できます。
関数を使用したクエリの実行 入力したクエリに関数をSQLトランスフォーメーションに含めて、Snowflakeターゲットエンドポイントでクエリを実行できます。
関数をプッシュするには、SELECT句のSQL文のみを使用する必要があります。選択クエリまたは関数でカラム名を指定します。「SELECT * FROM TABLE」などの文を使用して関数をプッシュしないでください。
入力したクエリでは、次のような関数を使用できます。
• UUID_STRING• RANDOM• RANDSTR• SIGN• CURRENT_REGION• CURRENT_ACCOUNT• CURRENT_ROLE• CURRENT_USER• CURRENT_DATABASE• CURRENT_SCHEMA• DAYNAME• SPLIT• SPLIT_PARTSQLトランスフォーメーションでCURRENT_ROLE、CURRENT_DATABASE、およびCURRENT_SCHEMA関数を使用するには、Snowflake Data Cloud接続の追加のJDBCパラメータフィールドにデータベース、ロール、およびスキーマ名を指定します。接続に値を指定しない場合、データ統合によってターゲットにNULLが挿入されます。
共有シーケンスの再利用 SQLトランスフォーメーションで定義した共有シーケンスを使用して、マッピングをSnowflakeエンドポイントにプッシュできます。データ統合は、Snowflakeソースと同じ順序でデータをターゲットに書き込みます。
Snowflakeから共有シーケンスを取得し、SQLトランスフォーメーションで入力したクエリでシーケンスを定義します。
入力したクエリの共有シーケンスを次の構文で指定します: Select <Snowflake_schema_name>.<Snowflake_database_name>.<sequence_name>.NEXTVAL
ユーザー定義関数 SnowflakeのJavaまたはSQLユーザー定義関数(UDF)から読み取るように、SQLトランスフォーメーションでカスタムクエリを設定できます。
UDFには次のガイドラインが適用されます。
• UDF名に改行文字が含まれたUDFを読み取ることはできません。• UDFに配列パラメータが含まれている場合、マッピングはSQL ELTの最適化を使用せずに実行されます。共有体トランスフォーメーション 次のような制限付きで、共有体トランスフォーメーションをプッシュできます。
• マッピングのソーストランスフォーメーションには、Snowflakeソースオブジェクトのみを含める必要があります。• ソースがAmazon S3、Google Cloud Storage、またはMicrosoft Azure Data Lake Storage Gen2である場合、マッピングはSQL ELTの最適化を使用せずに実行されます。アップデートストラテジトランスフォーメーション アップデートストラテジトランスフォーメーションを使用することはできません。
代わりにターゲットトランスフォーメーションの更新および更新/挿入操作を使用して、Snowflakeに書き込みを行うことができます。