# แนะนำ Software-Defined Assets

**URL:** <https://discuss.dataengineercafe.io/t/software-defined-assets/172>\
**Category:** Dagster\
**Tags:** dagster, declarative, asset\
**Created:** [April 13, 2022, 4:07am UTC](https://discuss.dataengineercafe.io/t/software-defined-assets/172 "2022-04-13T04:07:26Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![zkan](https://yyz1.discourse-cdn.com/flex035/user_avatar/discuss.dataengineercafe.io/zkan/32/2_2.png) [@zkan](https://discuss.dataengineercafe.io/u/zkan)\
**Post date:** [April 13, 2022, 4:07am UTC](https://discuss.dataengineercafe.io/t/software-defined-assets/172/1 "2022-04-13T04:07:26Z")

</div>

Software-Defined Assets นี่เป็น concept ใหม่ใน Dagster ครับ เพิ่งประกาศอย่างเป็นทางการออกมาตอนวันที่ 1 มี.ค. 65 ที่ผ่านมา

> **[Introducing Software-Defined Assets | Dagster Blog](https://dagster.io/blog/software-defined-assets)**
>
> Software-Defined Assets are a transformative new abstraction that allows data teams to focus on the end-product not the individual tasks in a data pipeline.

ตอนแรกผมอ่านแล้วยังไม่ค่อยเห็นภาพว่ามันจะต่างจากพวก concept เดิมอย่าง op หรือ graph อย่างไรบ้าง ปกติก็ทำได้อยู่แล้วไม่ใช่เหรอไรงี้ จนวันนี้อยากจะลองทำความเข้าใจมากขึ้นเลยได้ดูวีดีโอนี้ (อัดไว้ตั้งแต่ปีที่แล้ว ตอนนั้นยังเป็น experimental API อยู่)

[![]( " - YouTube") ](https://www.youtube.com/watch?v=4ZYxVmxXzjw)

ถึงได้เข้าใจความดีงามของมันมากขึ้นครับ มันถูกพัฒนาบน graph/job/op APIs ครับ

 ![Dagster - Complementary to existing APIs](https://canada1.discourse-cdn.com/flex035/uploads/dataengineercafe/original/1X/801f173818ced795b95f95b97fc929e15e098923.jpeg)

การทำแบบนี้ทำให้การจัดการการไหลของข้อมูลของเราเป็นแบบ [declarative approach](https://www.techtarget.com/searchitoperations/definition/declarative-programming) (คือเขียนโค้ดเน้นว่าเราต้องการทำ “อะไร”)

เราสามารถเขียน asset แล้วเอาแต่ละ asset มาเชื่อมต่อกันได้ โดยประกาศเป็น function เฉยๆ แล้วใช้ asset key มาเป็น input parameter ประมาณตัวอย่างโค้ดสั้นๆ ด้านล่างนี้

```python
from dagster import AssetGroup, asset

@asset
def upstream_asset():
    return [1, 2, 3]

@asset
def downstream_asset(upstream_asset):
    return upstream_asset + [4]

asset_group = AssetGroup([upstream_asset, downstream_asset])

```

- `upstream_asset` เป็น asset ตัวแรก
- `downstream_asset` รับ `upstream_asset` มาเป็น input parameter

จะเห็นได้ว่าเราไม่ต้องเอามาประกอบเป็น graph หรือ job แบบที่เราใช้ op เลย

ในวีดีโอด้านบนยังมีตัวอย่างให้ดู เราจะเห็นเลยว่า asset แต่ละอัน มัน produce ตัว materialization หรือ output ที่จับต้องได้ อะไรออกมา

 ![hacker_news_api_download](https://canada1.discourse-cdn.com/flex035/uploads/dataengineercafe/original/1X/7c424ac803e2631d9871eb30f0e49e611375c076.jpeg)

และถ้าเรามีหลายๆ ทีม อยากจะใช้ asset ของอีกทีมหนึ่งก็สามารถทำได้โดยการสร้าง job ของตัวเองขึ้นมา แล้วอ้างอิงโดยใช้ asset key ของอีก job หนึ่งได้เลย

 ![story_recommender](https://canada1.discourse-cdn.com/flex035/uploads/dataengineercafe/original/1X/d170f75b6431d6e313f9dab6d28bab96af79f160.jpeg)

แล้วถ้าเราใช้ [dbt](https://www.getdbt.com/) เราก็แค่อ้างอิงไปที่ project path ของ dbt แล้วเดี๋ยว Dagster มันจะสร้างออกมาเป็น graph ให้เองด้วย!

สรุปแล้ว… ตามไปดูวีดีโอด้านบนกันครับ 😂 จะเข้าใจมากขึ้น ผมนี่หลงรักคอนเซปนี้ซะแล้วสิ

---

<div class="post-metadata">

**Author:** ![zkan](https://yyz1.discourse-cdn.com/flex035/user_avatar/discuss.dataengineercafe.io/zkan/32/2_2.png) [@zkan](https://discuss.dataengineercafe.io/u/zkan)\
**Post date:** [April 16, 2022, 12:06am UTC](https://discuss.dataengineercafe.io/t/software-defined-assets/172/2 "2022-04-16T00:06:05Z")

</div>

อันนี้อีกวีดีโอหนึ่งครับ ที่งาน [Data Council Austin '22](https://discuss.dataengineercafe.io/t/data-council-austin-22/176) ที่เพิ่งจัดมาก่อนสงกรานต์สดๆ ร้อนๆ เลย

[![](https://canada1.discourse-cdn.com/flex035/uploads/dataengineercafe/original/1X/d0fa5283a328dc401d958e7d841504311b5314bd.jpeg "Rethinking Orchestration as Reconciliation: Software Defined Assets in Dagster | Elementl") ](https://www.youtube.com/watch?v=pRGNxIz6GzU)
