Kedro与MongoDB和其他文档数据库



在MongoDB或其他文档数据库中使用kedro的最佳实践是什么?例如,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而没有简单查询字符串的数据库时,数据加载逻辑应该在哪里?

逻辑应该去哪里找到这篇文章,然后将其解析为数据帧?

Imo,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不能在catalog.yml中定义,必须在Python端"手动"添加到DataCatalog中。

相关内容

  • 没有找到相关文章

最新更新