首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式在kedro 0.18中注册Kedro数据目录?

如何以编程方式在kedro 0.18中注册Kedro数据目录?
EN

Stack Overflow用户
提问于 2022-11-08 07:45:05
回答 1查看 64关注 0票数 0

由于各种原因(主要是动态构造文件路径的能力),我喜欢编程定义数据目录,而不使用yaml文件来定义数据集。

代码语言:javascript
复制
DataCatalog(
    {"products": ParquetDataSet(filepath=f{PREFIX}/products.parquet") 
...
})

在kedro0.17中,曾经是通过register_catalog钩子简单地注册目录,以便在管道定义中使用它的数据集。

但是在0.18中,这个钩子是不存在的,并且在钩子RegistrationSpecs中没有规格说明节。

在kedro0.18中有什么方法替代register_catalog

我搜索了文档,并试图在yaml文件中实现目录,但这不符合项目的要求。TemplatedConfigLoader可能是一个选项,但我不允许实现自定义逻辑,构造数据集的路径。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-08 12:19:49

不确定这是否是您要寻找的确切功能,但我一直在使用after_context_createdafter_catalog_created挂钩的组合,以编程方式添加数据集。

只需为所需的数据集创建一个"add“方法,并使用这些文档来查看需要什么args。在下面的示例中,我的数据在S3中,所以我创建了一个方法,从credentials.yml中获取我的creds并将它们传递给PickleDataSet

代码语言:javascript
复制
import logging
from kedro.config import ConfigLoader
from kedro.framework.project import settings
from kedro.framework.hooks import hook_impl
from kedro.extras.datasets.pickle.pickle_dataset import PickleDataSet


class ProjectHooks:
    @property
    def _logger(self):
        return logging.getLogger(__name__)

    @hook_impl
    def after_context_created(self, context):
        self.project_path = context.project_path
        self._logger.info(f"Project path: {self.project_path}")

    def _get_credentials(self, key):
        conf_path = f"{self.project_path}/{settings.CONF_SOURCE}"
        conf_loader = ConfigLoader(conf_source=conf_path, env="local")
        return conf_loader.get("credentials*")[key]

    def add_pickle_dataset(self, name, folder, layer=None):
        self.catalog.add(
            data_set_name=name,
            data_set=PickleDataSet(
                filepath=f"s3://root/data/{folder}/{name}",
                credentials=self._get_credentials("dev_s3"),
            ),
            replace=True,
        )
        if layer:
            self.catalog.layers[layer].add(name)
        self._logger.info(f"Added dataset '{name}' to the data catalog.")

    @hook_impl
    def after_catalog_created(self, catalog):
        self.catalog = catalog
        datasets = self.catalog.load("params:datasets")
        for dataset in datasets:
            self.add_pickle_dataset(
                name=f"{dataset}",
                folder="07_model_output",
                layer="Model Output",
            )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74357203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档