在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
,并将其交换到项目中的其他节点(例如JSONLocalDataSet
或JSONBlobDataSet
(,它将只适用于"纯"节点,但在MongoClient的情况下则不行——你也必须更改节点逻辑——这是Kedro建议避免的。
作为另一个不意味着创建新数据集的选项,您也可以考虑使用kedro.io.LambdaDataSet
——您需要提供自己的挂钩来保存和加载。但是,请注意,LambdaDataSet
不能在catalog.yml
中定义,必须在Python端"手动"添加到DataCatalog
中。