Python レシピでの「RELOAD SCHEMA FROM TABLE」相当のスキーマの再作成について

Takamitsu
Takamitsu Partner, Registered Posts: 3 Partner

「RELOAD SCHEMA FROM TABLE」で行われている操作を、Python レシピで実現する方法を模索しています。以下に、具体的な要件を説明します。

Python レシピの Output 先として PostgreSQL 上のテーブルを指定し、以下の動作を実現したいと考えています。

・Python レシピ内のコードでは、データの書き込みは実施しない。

・その代わり、Python レシピ内のコードからリモート実行するスクリプトが、Output先として指定されているテーブルをDB上に作成し、値を書き込む。

この場合、Flow 上で Output 先となっているデータセットを参照すると「Invalid argument」が表示されますが、「Settings」タブの「RELOAD SCHEMA FROM TABLE」をクリックすることで、PostgreSQL 上のテーブル定義に基づき、スキーマが再作成されるかと思います。

この、『人手による「RELOAD SCHEMA FROM TABLE」をクリック』を行わずに、Python レシピでのPythonスクリプトにてPostgreSQL 上のテーブル定義で自動で反映し、スキーマを再作成するための手法があれば、教えていただきたいです。

Best Answer

Answers

  • Tsuyoshi
    Tsuyoshi Dataiker, PartnerAdmin, Dataiku DSS Core Designer, Dataiku DSS ML Practitioner, Dataiku DSS Adv Designer, Registered Posts: 200 Dataiker

    Pythonレシピ内では、出力データセットに対するAPI経由のスキーマ変更は不可と考えられます。(一方、入力データセットに対するAPI経由のスキーマ変更は可能なはずです。)

    そこで、対応方法としましては、シナリオ機能で「スキーマを再読み込み(Reload schema)」ステップを定義し、そのシナリオをPythonレシピ内で実行する案が考えられます。

    image.png

    上記のように定義したシナリオを、コードレシピの中で以下のように API経由で実行します。

    import dataiku
    #定義しておいたシナリオをシナリオIDを指定して実行
    scenario = dataiku.api_client().get_default_project().get_scenario("schema_update")
    scenario.run_and_wait()

    上記のような方法にて、今回想定されている処理を実現できそうでしょうか?

  • Takamitsu
    Takamitsu Partner, Registered Posts: 3 Partner

    回答いただきありがとうございます。
    教えて頂いた方法を試したところ、意図した動作になりました。
    ありがとうございます。

    今回作成したPythonレシピを、今後プラグイン化するということも考えております。
    そうなった場合、
    ・シナリオもプラグインに含めることができるのでしょうか
    ・(プラグインに含めることができる場合)
      リロード対象のデータセットを、プラグインのOutputに指定されているデータセットに動的に指定することはできるのでしょうか?

    もし、シナリオをプラグインに含められない場合、シナリオはあらかじめ利用者に作成してもらい、
    プラグインの中のPythonコードでは、そのシナリオを起動するというやり方ができるのではと考えています。
    (シナリオ名は決め打ちにするか、プラグインのパラメータとして入力してもらう等のやり方でできると考えています。)

  • Takamitsu
    Takamitsu Partner, Registered Posts: 3 Partner

    回答いただきありがとうございます。
    提案いただいた方法で、検証を進めていきたいと思います。

Setup Info
    Tags
      Help me…