在我提出问题之前,先谈谈我们的问题。
我们正在制定政府收入预测申请。在这个应用程序中,我们收集有关以前收入的数据,应用几个计量经济学和政治投影模型(通过几个阶段),同时将其持久化到数据库。
简而言之,这是投影系统的简化模型:
使用此架构的几行(开始时,~6000行)代表过去的收入(称为业务情景):
+------+------+------+------+------+-------+---------+
| Cat1 | Cat2 | Cat3 | Cat4 | Year | Month | Revenue |
+------+------+------+------+------+-------+---------+
在整个投影系统中,数据以多种方式转换(移动类别,改变收入值,修复非典型性等)。每个转换都在一个阶段完成:
Initial Scenario (S0) ---(1st transformation phase)--> Transformed Scenario (S1)
S1 ---(2nd t.p.)--> S2 ---> S3 ---...---> SN
每个阶段都会转换一个场景,这个块的大小从2-100%的数据变化,部分场景状态必须保持不变,直到达到最终状态(SN)。部分状态只能是变换后的行或整个部分情景(只要可以比较部分状态)。
此外,用户可以返回到该过程(例如,返回到阶段2)并从那里重新开始投影,忽略之前完成的工作。
在这个用例中,我们遇到了RDBMS的问题:它们对于写操作来说确实很慢(花费半小时进行场景预测)。
在阅读了NoSQL DBMS之后,我们得到了几个选项,但是,由于我还在学习曲线上,我想问一下:在这个用例中使用的最佳选择是什么:VoltDB,Redis,Riak ,Cassandra,MongoDB或HBase?
提前致谢。
答案 0 :(得分:2)
我将从MongoDB的角度介绍我的解决方案。也许其他人可以从其他数据库中添加他们的经验。
Mongo有一个map / reduce框架,允许您针对数据运行非常复杂的查询。关于map / reduce的好处是你可以将结果输出到数据库中的集合(类似于RDBMS中的表)。
所以它会是:
每个步骤都会产生一组持久的数据。这可以让你从中断的地方继续前进。你当然必须在完成后清理,但它可以工作。
我不是Hadoop专家,但您的情景听起来非常适合他们的生态系统。以中间产出分阶段运行复杂的工作。