[英]How to dynamically rename a task run based on passed variable from within a Prefect flow for Prefect 2.0?
我有一個完美的任務,它將按名稱從數據庫中獲取一個表,如下所示。 我想要做的是讓任務運行名稱包含源表變量,以便我可以輕松地從 Prefect Cloud UI 跟蹤它(當我在一個流程中獲取 10 多個表時)。
@task
def source_table_by_name(id, table_name):
logger = get_run_logger()
sql = f"SELECT * FROM {table_name} WHERE upload_id = '{id}'"
df = pd.read_sql(sql, sd_engine_prod)
logger.info(f"Source table {table_name} from database")
return df
我最初嘗試做的是在名稱中放置一個模板,以便能夠引用傳遞的變量(老實說,ChatGPT 讓我產生了這個幻覺)。
@task(name='source_table_by_name_{table_name}')
def source_table_by_name(id, table_name):
logger = get_run_logger()
sql = f"SELECT * FROM {table_name} WHERE upload_id = '{id}'"
df = pd.read_sql(sql, sd_engine_prod)
logger.info(f"Source table {table_name} from database")
return df
@flow
def report_flow(upload_id):
df_table1 = source_table_by_name(upload_id, table1)
df_table2 = source_table_by_name(upload_id, table2)
我可以為每個要獲取的表編寫一個特定的任務,這樣命名是固定的,但從一開始就很清楚。 但是,如果可能的話,采用更 DRY 的方法會很棒。
完全合理的問題,我們有一個內部 WIP 可以更好地解決這個問題,還有這個未解決的問題,但現在您可以使用with_options()
並通過 for 循環傳遞變量:
from prefect import flow, task
from typing import List
import time
@task
def hello_world(user: str) -> None:
print(f"✨ Hello from Prefect, {user}! 👋 📚")
time.sleep(5)
@flow(log_prints=True)
def hi(
users: List[str] = [
"Marvin",
"Anna",
"Prefect"
]
) -> None:
for user in users:
hello_world.with_options(name=user).submit(user)
if __name__ == "__main__":
hi()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.