ETLで、特定条件時に別の列の値

オプション
ユーザー07933
編集済: 5月 2023 仲間に相談

ETLで、ある列Aが特定条件時(文字列一致、IS NULLなど)に、ある列Bの値をそのまま設定したいのですが、いい組み方はありますか?

「値マッパ」では、列Bの値という指定はできず、直書きの値にしかなりません。

現状の回避策は、「行をフィルター」で特定条件とそうでないものを分岐し、特定条件の場合に「列の値を設定」で列Bを設定、その後別れた分岐と「行を追加」でunionしています。ただ分岐&unionはかなり遅くなるので、分岐しない方法を探しています。

ベストアンサー

  • ユーザー07933
    回答済み✓
    オプション

    ご返信ありがとうございます!

    それだったら、「Aが2の場合はB、それ以外はA」とBeast Modeを書くこととほとんど一緒かなぁと思ってしまいましたが、おかげさまでいいアイデアがひらめきました。

     

    "値マッパ"&"列の値を設定"で「A」をコピーし新規列「C」を作り、”値マッパ"で「C」の条件不一致(A==2以外)の値を0へ上書き。"値マッパ"で「A」から条件(A==2)一致で0、それ以外はデフォルトで新規列「D」を作る。

    A  B  C  D

    1  10  0  1

    2  20  20  0

    2  30  30  0

    3  40  0  3

    3  50  0  3

    このあと、C+Dで新規列「E」を作る。

    A  B  C  D  E

    1  10  0  1  1

    2  20  20  0  20

    2  30  30  0  30

    3  40  0  3  3

    3  50  0  3  3

     

    上記は数値の場合でしたが、文字列の場合は0の代わりに空文字列とし、CとDの文字列結合でEを作ると応用できそうです。

    改めて見ると、分岐のロジックとあまり変わらないので、なぜ思いつかなかったんだろうという感じですが。。また、ご指摘通り条件が多いと嫌な点はありますが、分岐よりはよいです。

    ご相談できてよかったです。ありがとうございました。

答え

  • これっち
    オプション

    こんにちは。

    ETLで完結するのは難しいと思いますので、Beast ModeでCase関数やIFNULL関数を使う、

    またはSQLで対処するしかないと思います。

    SQLの方が対応しやすいですが、下記を参考にして頂ければBeast Modeでも解決すると思います。

     

    DOMOヘルプ

    https://knowledge-ja.domo.com/Visualize/Adding_Cards_to_Domo/KPI_Cards/Transforming_Data_Using_Beast_Mode/Beast_Mode_FAQs

  • ユーザー07933
    オプション

    ご提案ありがとうございます。

    DataFlowの途中で一時的に算出したかったり、連続実行するDataFlowの1つで使う場面もありますので、Beast Modeでの対応はちょっと辛いなと思います。SQLでの対応も選択肢に入れます。

     

    しかしこれまでETLで作っていることもありできればETLで完結したいと考えております。ETLでトリッキーな組み合わせ技でもいいので、いいアイデアがあれば引き続きよろしくお願いします。

  • これっち
    オプション

    返信ありがとうございます。

     

    値マッパ ⇒ 列の値を設定 ⇒ 値マッパ という流れではいかがでしょうか。

     

    ①値マッパで対象項目の条件に仮一致するものを新規項目として仮に値をセット

    ②列の値を設定で「置き換えられる~」に①の項目を、「置き換える~」にセットしたい項目を一旦セット

    ③値マッパで置き換えたくないもの以外を「空文字」や「NULL」などでセット

     

    上記では項目は2つに分かれますが、途中で演算等で使用するなら良いかと思います。

     

     

  • ユーザー07933
    オプション

    > ①値マッパで対象項目の条件に仮一致するものを新規項目として仮に値をセット
    > ②列の値を設定で「置き換えられる~」に①の項目を、「置き換える~」にセットしたい項目を一旦セット
    > ③値マッパで置き換えたくないもの以外を「空文字」や「NULL」などでセット

    すみませんが、わからない点が3つあります。
    - ①の仮一致というものは何でしょうか?
    - ②でいう「①の項目」というのは、①で作った新規項目ですか?それを上書きしてしまう??
    - ③の「置き換えたくないもの以外」=「置き換えたいもの」だと思いますが、それを「NULL」にすると理由はなんでしょうか?


    具体的な列で考えてみます。
    列「A」に[1, 2, 3]のいずれかの整数が入っており、2の場合は列「B」の値に置換したいとします。
    A  B
    1  10
    2  20
    2  30
    3  40
    3  50
    ↓(希望)
    A B
    1 10
    20 20
    30 30
    3 40
    3 50

    ①で新規列「C」へ、条件一致した項目をセット。不一致時は(最初の値だと「A」そのものなので)999。
    A  B C
    1  10 999
    2  20 2
    2  30 2
    3  40 999
    3  50 999
    ②でわからなくなります。

  • これっち
    オプション

    >- ①の仮一致というものは何でしょうか?
    ①はダミーで項目を追加するイメージです。
    A B C
    1 10 999
    2 20 999
    2 30 999
    3 40 999
    3 50 999

     

    >- ②でいう「①の項目」というのは、①で作った新規項目ですか?それを上書きしてしまう??
    ②で①で作った新規項目へ置き換えたい項目を丸っとコピー
    A B C
    1 10 10
    2 20 20
    2 30 30
    3 40 40
    3 50 50

     

    >- ③の「置き換えたくないもの以外」=「置き換えたいもの」だと思いますが、それを「NULL」にすると理由はなんでしょうか?
    NULLや空文字で判定し易くなるので。
    ③で条件一致以外を一律置き換えることによって、
    B列とC列を使い分ければ良いかなと思いました。
    ※ただ条件が複数ある場合は使い辛いですね。。。
    A B C
    1 10 NULL
    2 20 20
    2 30 30
    3 40 NULL
    3 50 NULL

     

    Beast ModeやSQLでこんな感じで使えるかと思いました。
    例)イメージは↓ですが、動作確認はしていません。。
    CASE WHEN C ISNULL THEN A
    WHEN C IS NOT NULL THEN B
    ELSE A
    END

     

    的外れな回答でしたら、スルーしてください。。

    実際は①だけでも完結出来ますが、あえて「列の値を設定」を使用することで、

    色々と使えるイメージが湧けばと思い投稿しました。

     

     

  • ユーザー07933
    回答済み✓
    オプション

    ご返信ありがとうございます!

    それだったら、「Aが2の場合はB、それ以外はA」とBeast Modeを書くこととほとんど一緒かなぁと思ってしまいましたが、おかげさまでいいアイデアがひらめきました。

     

    "値マッパ"&"列の値を設定"で「A」をコピーし新規列「C」を作り、”値マッパ"で「C」の条件不一致(A==2以外)の値を0へ上書き。"値マッパ"で「A」から条件(A==2)一致で0、それ以外はデフォルトで新規列「D」を作る。

    A  B  C  D

    1  10  0  1

    2  20  20  0

    2  30  30  0

    3  40  0  3

    3  50  0  3

    このあと、C+Dで新規列「E」を作る。

    A  B  C  D  E

    1  10  0  1  1

    2  20  20  0  20

    2  30  30  0  30

    3  40  0  3  3

    3  50  0  3  3

     

    上記は数値の場合でしたが、文字列の場合は0の代わりに空文字列とし、CとDの文字列結合でEを作ると応用できそうです。

    改めて見ると、分岐のロジックとあまり変わらないので、なぜ思いつかなかったんだろうという感じですが。。また、ご指摘通り条件が多いと嫌な点はありますが、分岐よりはよいです。

    ご相談できてよかったです。ありがとうございました。