在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类似乎并不合适,因为如果您想要支持插入、聚合等,最终将不得不用笨重的PyMongo参数包装整个yaml。
MongoDataSet类应该只返回一个MongoClient对象并捕获kedro节点中的任何进一步的逻辑吗?
通常,当您使用具有这些函数式(非SQL)API但没有简单查询字符串的数据库时,数据加载逻辑应该位于何处?
发布于 2019-11-21 01:05:08
逻辑应该在哪里找到这篇文章,然后将其解析成数据帧?
国际海事组织,MongoDataSet并不是一个坏主意。Kedro已经为各种来源提供了相当多的contrib datasets包装IO逻辑,所以对我来说,MongoDataSet非常适合这个逻辑。
如果你想支持像插入、聚合之类的东西,你最终不得不用笨重的
参数来包装整个yaml PyMongo。
我想说的是,立即创建整个pymongo的完整包装器并不是一个很强的要求。即使您的dataset只能在加载时执行find(),在保存时执行insert_many(),这已经是一个很好的开始。
MongoDataSet类应该只返回一个MongoClient对象并捕获kedro节点中的任何进一步的逻辑吗?
Kedro的节点philosophy是纯Python函数,这种方法对我来说非常不同,因为节点对如何处理数据加载和保存有太多的“控制”。此外,它破坏了数据集之间的互换性-如果您(或其他人)决定在未来放弃MongoDataSet,并将其交换为您项目中的其他东西(例如,JSONLocalDataSet或JSONBlobDataSet),它将仅适用于“纯”节点,但不适用于MongoClient -您还必须更改节点逻辑-这是Kedro建议避免的。
作为另一种不意味着创建新数据集的选择,您还可以考虑使用kedro.io.LambdaDataSet -您需要提供自己的钩子来保存和加载。但是,请注意,LambdaDataSet不能在catalog.yml中定义,必须在Python端“手动”添加到DataCatalog中。
https://stackoverflow.com/questions/58940390
复制相似问题