3

将 kedro 与 MongoDB 或其他文档数据库一起使用的最佳实践是什么?例如,MongoDB 没有类似于 SQL 的查询语言。Python 中的大多数 Mongo“查询”(使用 PyMongo)看起来像这样:

from pymongo import MongoClient
client = MongoClient(...)  // Credentials go here

posts = client.test_database.posts

posts.find_one({"author": "Mike"})

然后你会得到这样的东西:

{u'_id': ObjectId('...'),
 u'author': u'Mike',
 u'date': datetime.datetime(...),
 u'tags': [u'mongodb', u'python', u'pymongo'],
 u'text': u'My first blog post!'}

现在我的问题是:逻辑应该去哪里找到这篇文章,然后把它解析成一个数据框?尝试创建一个类似乎不合适,MongoQueryDataSet因为如果你想支持诸如插入、聚合等之类的东西,你最终将不得不用笨重的 yaml 参数包装整个 PyMongo API。

一个类是否应该MongoDataSet只返回一个MongoClient对象并在 kedro 节点中捕获任何进一步的逻辑?

一般来说,当您使用具有这些功能性(非 SQL)API 而没有简单查询字符串的数据库时,数据加载逻辑应该存在于何处?

4

1 回答 1

1

逻辑应该去哪里找到这篇文章,然后把它解析成一个数据框?

海事组织,MongoDataSet这不是一个坏主意。Kedro 已经有相当多的contrib 数据集包含各种来源的 IO 逻辑,所以对我来说MongoDataSet非常适合这个逻辑。

如果您想支持插入、聚合等内容,您最终将不得不用笨重的 yaml 参数包装整个 PyMongo API。

我想说立即创建一个完整的完整包装并不是一个强烈的要求pymongo。即使您的数据集只能find()在加载和insert_many()保存时执行,这已经是一个好的开始。

MongoDataSet 类是否应该只返回一个 MongoClient 对象并在 kedro 节点中捕获任何进一步的逻辑?

Kedro 有这种节点是纯 Python 函数的理念,这种方法对我来说完全不同,因为节点对它们如何处理数据加载和保存有太多的“控制”。此外,它破坏了数据集之间的可互换性 - 如果您(或其他人)决定MongoDataSet在未来放弃并将其交换为项目中的其他内容(例如,JSONLocalDataSetJSONBlobDataSet),它只会与“纯”节点一起使用,但是在 MongoClient 的情况下不是 - 您也必须更改节点逻辑 - 这是 Kedro 建议避免的。


作为不意味着创建新数据集的另一个选项,您也可以考虑使用kedro.io.LambdaDataSet- 您需要提供自己的挂钩来保存和加载。但是请注意,这LambdaDataSet不能在 Python 端定义catalog.yml,必须添加到“手动”中。DataCatalog

于 2019-11-20T17:05:08.480 回答