0 votes

Hi,

 I would like to add a new folder to the recipe's output, bases on the documentaion there is just a get method for recipe inputs/outputs.

Is there any way to set it?

Thanks

classdataikuapi.dss.recipe.DSSRecipeDefinitionAndPayload(data)

Definition for a recipe, that is, the recipe definition itself and its payload

get_recipe_raw_definition()

get_recipe_inputs()

get_recipe_outputs()

get_recipe_params()

get_payload()

get_json_payload()

set_payload(payload)

set_json_payload(payload)

asked by

1 Answer

0 votes
Best answer

Hi,

You can use the set_definition_and_payload method of the class dataikuapi.dss.recipe.DSSRecipe to update an existing recipe. This is highlighted in https://doc.dataiku.com/dss/latest/api/public/client-python/reference.html#dataikuapi.dss.recipe.DSSRecipe.set_definition_and_payload.

Otherwise, if you want to create a new recipe, you will need a dataikuapi.dss.recipe.DSSRecipeCreator class (see https://doc.dataiku.com/dss/latest/api/public/client-python/reference.html#dataikuapi.dss.recipe.DSSRecipeCreator)

Cheers,

Alex

answered by
selected by
Yes I know, but can you give me an example? I dont know how to change inside the definition object the inputs/outputs.

folder = prj.get_managed_folder('qFs1aIyX')
recipe=dataikuapi.dss.recipe.DSSRecipe(client, 'S3_IMPORT', 'compute_process_s3')
df=recipe.get_definition_and_payload()
##########################################
# Here I want to add the folder as a recipe output:
df.add_recipe_input?( folder )
##########################################

recipe.set_definition_and_payload(df)

Thanks!
Hi,
You need to get the result of get_definition_and_payload() and modify it. It is a Python dictionary which contains all elements describing the recipe and its outputs. Then once modified, pass it back to set_definition_and_payload().
Cheers,
Alex
Hi Tomas,
Sorry about this, I forgot one step: you need to modify the result of get_recipe_raw_definition() on the DSSRecipeDefinitionAndPayload instance in order to then use set_definition_and_payload(). So if I put it all back together, you will need:

import dataiku
import dataikuapi
client = dataiku.api_client()
project = client.get_project(dataiku.default_project_key())
recipe = dataikuapi.dss.recipe.DSSRecipe(client, 'SANDBOX', 'compute_something')
definition_and_payload = recipe.get_definition_and_payload()
print(definition_and_payload.get_recipe_raw_definition())
# Here you modify the raw definition in-place as a Python dictionary (example below)
definition_and_payload.get_recipe_raw_definition()["outputs"] = {u'main': {u'items': [{u'appendMode': False,
     u'ref': u'JZLLhzOn'}]}}
recipe.set_definition_and_payload(definition_and_payload)
# Now you will get a message telling you that the recipe has been updated. You can verify with:
print(recipe.get_definition_and_payload().get_recipe_raw_definition())
Thanks, that worked!
892 questions
921 answers
898 comments
1,403 users