1

使用 SQL 数据库,可以很容易地执行统计/聚合函数,如协方差、标准差、峰度、偏度、偏差、均值和中位数、求和和乘积等,而无需将数据取出到应用程序服务器。 http://www.xarg.org/2012/07/statistical-functions-in-mysql/

对于大型数据集,一般 NoSql 数据库和特别是 dynamodb(cassandra) 上的此类计算如何有效地完成(尽可能靠近商店,假设 map/reduce “作业”不是实时的)。

AWS RDS(MySQL、PostgresSQL,...)不是 NoSQL,而 Amazon Redshift(ParAccel)——一个列存储——有一个 SQL 接口,可能有点过分了(6.85 美元/小时)。Redshift 的聚合功能有限http://docs.aws.amazon.com/redshift/latest/dg/c_Aggregate_Functions.html、http://docs.aws.amazon.com/redshift/latest/dg/c_Window_functions.html

4

3 回答 3

2

对于没有聚合功能的数据库(例如 Cassandra),您总是需要提取一些数据。目前,在您的数据库附近构建分布式计算集群是一种流行的选择(使用Storm等项目)。通过这种方式,您可以并行请求和处理数据以执行操作。将其视为“实时”Hadoop(尽管不一样)。

实施这样的设置显然比拥有一个开箱即用的支持系统更复杂,所以在你的决定中考虑到这一点。好处是,如果需要,集群允许您执行复杂的自定义分析,这超出了传统数据库解决方案所支持的任何内容。

于 2013-11-17T17:21:06.033 回答
1

好吧,在 MongoDB 中,您可以创建某种 UDF:

db.system.js.save( { _id : "Variance" ,
value : function(key,values)
{
    var squared_Diff = 0;
    var mean = Avg(key,values);
    for(var i = 0; i < values.length; i++)
    {
        var deviation = values[i] - mean;
        squared_Diff += deviation * deviation;
    }
    var variance = squared_Diff/(values.length);
    return variance;
}});


db.system.js.save( { _id : "Standard_Deviation"
, value : function(key,values)
{
    var variance = Variance(key,values);
    return Math.sqrt(variance);
}});

描述在这里

于 2013-11-16T08:37:16.460 回答
1

MongoDB 有一些聚合功能可能满足您的需求http://docs.mongodb.org/manual/aggregation/

于 2013-11-18T08:43:02.093 回答