https://dagster.io/ logo
#ask-ai
Title
# ask-ai
d

Dominik Lotz

02/29/2024, 9:59 AM
@Scout use a dbt asset as
ins
to another asset
s

Scout

02/29/2024, 9:59 AM
To use a dbt asset as an input (
ins
) to another asset in Dagster, you can reference the dbt asset's key when defining your downstream asset. The documentation provides guidance on how to make non-dbt assets depend on dbt assets by ensuring that the asset key included on the downstream asset matches the asset key that's generated for the dbt model when you load it into Dagster. Here's an example from the documentation that illustrates how you might specify a dbt asset as an upstream dependency of a non-dbt asset:
Copy code
python from dagster_dbt import dbt_cli_resource, dbt_assets from dagster import asset  # Assuming you have a dbt project with a model named 'orders' dbt_assets = dbt_assets(manifest="path_to_dbt_manifest.json")  @asset(required_resource_keys={"dbt"}, ins={"orders": dbt_assets.get_asset_key("orders")}) def downstream_asset(context, orders):     # Your logic here that uses the 'orders' dbt asset as an input     pass
In this example,
dbt_assets.get_asset_key("orders")
is used to retrieve the asset key for the dbt model named 'orders', and this key is then used to define the
ins
for the
downstream_asset
. The
required_resource_keys
parameter specifies that the
dbt
resource is required for this asset, which is typically configured to point to your dbt project. Please note that the exact syntax and method names may vary depending on the version of Dagster you are using, and you should refer to the latest documentation for the most accurate and up-to-date information.
d

Dominik Lotz

02/29/2024, 10:17 AM
@Scout I define the dbt assets in another file but in the same context. Can i get the defined dbt assets from this context?
s

Scout

02/29/2024, 10:17 AM
In Dagster, if you have defined dbt assets in one file and you want to use them in another file within the same context, you can import the dbt assets into the file where you want to use them. This is a common practice in Python to maintain modularity and separation of concerns. Here's a simplified example of how you might structure your code: dbt_assets.py:
Copy code
python from dagster_dbt import dbt_cli_resource, dbt_assets  # Define your dbt assets using the dbt_assets decorator @dbt_assets(manifest="path_to_dbt_manifest.json") def my_dbt_assets():     # dbt asset definitions     pass  # You can also define individual dbt assets if needed
downstream_assets.py:
Copy code
python from dagster import asset from dbt_assets import my_dbt_assets  # Import the dbt assets from the other file  @asset(required_resource_keys={"dbt"}, ins={"orders": my_dbt_assets.get_asset_key("orders")}) def downstream_asset(context, orders):     # Your logic here that uses the 'orders' dbt asset as an input     pass
In this setup, you define your dbt assets in
dbt_assets.py
and then import the
my_dbt_assets
function in
downstream_assets.py
. You can then use
my_dbt_assets.get_asset_key("orders")
to get the asset key for the dbt model named 'orders' and use it as an input to your downstream asset. Please ensure that the
manifest
path you provide to
dbt_assets
is correct and that the dbt assets are properly loaded. Also, make sure that the
required_resource_keys
are correctly configured to include any resources needed by the assets. Keep in mind that the actual implementation details may vary based on your specific project setup and the version of Dagster you are using. Always refer to the latest documentation for the most accurate guidance.
d

Dominik Lotz

02/29/2024, 11:51 AM
@Scout Is a dbt asset returning something? And if so, what scheme does this return have?
s

Scout

02/29/2024, 11:51 AM
In Dagster, dbt assets created using the
dbt_assets
decorator from the
dagster_dbt
integration do not return data in the traditional sense that a Python function might. Instead, they represent the models and tests within a dbt project as software-defined assets in the Dagster asset graph. The primary purpose of these assets is to be materialized (computed) and to track their lineage and dependencies within the Dagster ecosystem. When a dbt asset is materialized, Dagster executes the corresponding dbt command (such as
dbt run
for a model) to compute the asset. The result of this computation is typically a table or view in a data warehouse, not a Python object that is returned by the asset definition. The "return value" of a dbt asset, in the context of Dagster, is the side effect of the dbt command execution, which is the creation or update of a dataset in the data warehouse. Dagster tracks this side effect as an asset materialization, which includes metadata about the execution, such as the time of materialization, any tags or metadata specified in the dbt model, and the success or failure status of the dbt command. The schema of the data created or updated by the dbt asset is defined within the dbt model itself, using SQL. This schema is not explicitly returned by the dbt asset in Dagster but is inherent in the structure of the dataset in the data warehouse. If you need to use the data produced by a dbt asset in downstream Dagster assets or operations, you would typically access the data directly from the data warehouse using appropriate data access patterns, such as SQL queries, rather than expecting a return value from the dbt asset.