KedroSession调用run时无法识别会话中新增的数据集
问题描述
在Jupyter Notebook中,执行以下命令时,使用catalog.yaml里预定义的数据集和参数能正常运行:
session.run(pipeline_name='sim', from_inputs=['measurements', 'params:simulation'])
但手动在会话里添加数据集后,再执行session.run就抛出ValueError:
>>> ds = GenMsmtsDataSet() >>> catalog.add('ipy_msmts', ds) >>> session.run(pipeline_name='sim', from_inputs=['ipy_msmts', 'params:simulation']) ValueError: Pipeline does not contain data_sets named ['ipy_msmts']
虽然catalog.list()显示ipy_msmts已经存在,而且catalog.load('ipy_msmts')能正常加载,但流水线就是识别不了这个手动添加的数据集。
原因分析
流水线的输入列表是在初始化阶段就固定死的——它只认预先在流水线配置或者catalog.yaml里声明过的数据集名称,不会自动感知你后来手动加到catalog里的新数据集。你的sim流水线一开始只配置了measurements作为输入源,根本不知道ipy_msmts是什么,所以就算你把它塞进catalog,流水线也不认这个输入项。
解决方案
方法一:修改流水线配置
直接在流水线的定义文件中,把ipy_msmts添加到允许的输入数据集列表里;如果框架支持的话,也可以配置成允许动态输入。
方法二:替换原有数据集
如果你只是想用自定义数据替换原来的measurements,不用新增数据集,直接覆盖catalog里已有的measurements条目即可:
ds = GenMsmtsDataSet() catalog.add('measurements', ds, replace=True) session.run(pipeline_name='sim', from_inputs=['measurements', 'params:simulation'])
方法三:动态调整流水线输入映射
如果用的是Kedro这类框架,可以在运行前调整流水线的输入映射,把ipy_msmts映射成流水线原本期待的measurements:
from kedro.pipeline import Pipeline, node # 获取已定义的sim流水线 sim_pipeline = session.pipeline.named_pipelines['sim'] # 重新映射输入,用ipy_msmts替代原来的measurements new_pipeline = sim_pipeline.from_inputs({'measurements': 'ipy_msmts'}) # 运行调整后的流水线 session.run(pipeline=new_pipeline, from_inputs=['ipy_msmts', 'params:simulation'])
内容的提问来源于stack exchange,提问作者ilja
相关产品推荐
相关产品推荐

