繁体   English   中英

Kedro - 如果数据集不能同时是节点的输入和输出(仅限 DAG),如何更新 Kedro 管道中的数据集?

[英]Kedro - How to update a dataset in a Kedro pipeline given that a dataset cannot be both input and output of a node (only DAG)?

在 Kedro 项目中,我在 catalog.yml 中有一个数据集,我需要在每次调用我的管道时通过添加几行来增加它。

#catalog.yml
my_main_dataset:
  type: pandas.SQLTableDataSet
  credentials: postgrey_credentials
  save_args:
    if_exists: append
  table_name: my_dataset_name

但是,我不能只依赖目录参数中的追加,因为我需要控制不在数据集中插入现有日期以避免重复。 我也不能创建一个节点,将我的数据集既作为输入(以查找已经存在的日期并与其他数据合并)又作为输出,否则我正在创建一个被禁止的循环(只允许 DAG)。 我被卡住了,看不到任何优雅的方法来解决我的问题。 我查看了其他线程,但到目前为止没有发现任何与 stackoverflow 相关的内容。

我尝试了一件非常丑陋的事情,那就是在同一个管道中创建一个独立的节点,只是为了查看我的数据集并在全局变量中记录最小和最大日期作为副作用,以便在主流中使用来控制追加. 它不仅丑陋,而且还失败了,因为我无法控制同一管道的独立节点的运行顺序......

理想情况下,我想实现这样的事情,这是 Kedro 禁止我编码的方式(不是 DAG):

#catalog.yml
my_main_dataset:
  type: pandas.SQLTableDataSet
  credentials: postgrey_credentials
  save_args:
    if_exists: append
  table_name: my_dataset_name

my_additional_dataset:
  type: pandas.SQLTableDataSet
  credentials: postgrey_credentials
  save_args:
    if_exists: append
  table_name: my__additional_dataset_name
#node.py
import pandas as pd

def increment_main_dataset(main_df, add_df):
  last_date = main_df['date'].max()
  filtered_add_df = add_df.loc[add_df['date'] > last_date]
  main_df = pd.concat([main_df, filtered_add_df], axis=0)
  return main_df
#pipeline.py

from kedro.pipeline import Pipeline, node, pipeline
from .nodes import *

def create_pipeline(**kwargs) -> Pipeline:
  return pipeline([
    node(
      func=increment_main_dataset,
      inputs=["my_main_dataset", "my_additional_dataset"],
      outputs="my_main_dataset",
      name="increment-dataset",
    ),
  ])

它可能不是最佳解决方案,但解决方法是将两个 kedro 数据集设置为指向同一物理空间。 一个用于读取,另一个用于写入,但写入同一个文件/表。 就像是:

#catalog.yml
my_main_dataset_read:  # same as my_main_dataset_write
  type: pandas.SQLTableDataSet
  credentials: postgrey_credentials
  save_args:
    if_exists: append
  table_name: my_dataset_name

my_main_dataset_write:  # same as my_main_dataset_read
  type: pandas.SQLTableDataSet
  credentials: postgrey_credentials
  save_args:
    if_exists: append
  table_name: my_dataset_name

my_additional_dataset:
  type: pandas.SQLTableDataSet
  credentials: postgrey_credentials
  save_args:
    if_exists: append
  table_name: my__additional_dataset_name
#node.py - no changes from your code
import pandas as pd

def increment_main_dataset(main_df, add_df):
  last_date = main_df['date'].max()
  filtered_add_df = add_df.loc[add_df['date'] > last_date]
  main_df = pd.concat([main_df, filtered_add_df], axis=0)
  return main_df
#pipeline.py

from kedro.pipeline import Pipeline, node, pipeline
from .nodes import *

def create_pipeline(**kwargs) -> Pipeline:
  return pipeline([
    node(
      func=increment_main_dataset,
      inputs=["my_main_dataset_read", "my_additional_dataset"],
      outputs="my_main_dataset_write",
      name="increment-dataset",
    ),
  ])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM