【问题标题】:Kedro with MongoDB and other document databases?Kedro 与 MongoDB 和其他文档数据库?
【发布时间】:2020-03-15 08:19:57
【问题描述】:

在 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 而没有简单查询字符串的数据库时,数据加载逻辑应该存在于何处?

【问题讨论】:

    标签: python mongodb kedro


    【解决方案1】:

    逻辑应该去哪里找到这个帖子然后解析成数据框?

    Imo,MongoDataSet 并不是一个坏主意。 Kedro 已经有相当多的 contrib datasets 包装各种来源的 IO 逻辑,所以对我来说 MongoDataSet 非常适合这个逻辑。

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

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

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2015-04-12
      • 2020-01-19
      • 2018-06-01
      • 1970-01-01
      • 2014-01-01
      相关资源
      最近更新 更多