在MongoDB中实现聚合函数

原创
2016-06-07 17:18:40 889浏览

我们在本文中使用的NoSQL是MongoDB,它是一种开源的文档数据库系统,开发语言为C++。它提供了一种高效的面向文档的存储结构,同时

随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据。传统方法存储和处理数据的成本将会随着数据量增长而显著增加。这使得很多组织都在寻找一种经济的解决方案,比如NoSQL数据库,它提供了所需的数据存储和处理能力、扩展性和成本效率。NoSQL数据库不使用SQL作为查询语言。这种数据库有多种不同的类型,比如文档结构存储、键值结构存储、图结构、对象数据库等等。

我们在本文中使用的NoSQL是MongoDB,它是一种开源的文档数据库系统,开发语言为C++。它提供了一种高效的面向文档的存储结构,同时支持通过MapReduce程序来处理所存储的文档;它的扩展性很好,而且支持自动分区。Mapreduce可以用来实现数据聚合。它的数据以BSON(二进制JSON)格式存储,在存储结构上支持动态schema,并且允许动态查询。和RDBMS的SQL查询不同,Mongo查询语言以JSON表示。

MongoDB提供了一个聚合框架,其中包括常用功能,比如count、distinct和group。然而更多的高级聚合函数,比如sum、average、max、min、variance(方差)和standard deviation(标准差)等需要通过MapReduce来实现。

这篇文章描述了在MongoDB存储的文档上使用MapReduce来实现通用的聚合函数,如sum、average、max、min、variance和standard deviation;聚合的典型应用包括销售数据的业务报表,比如将各地区的数据分组后计算销售总和、财务报表等。

我们从本文示例应用所需软件的安装开始。

软件安装

首先在本地机器上安装并设置MongoDB服务。

  • 从Mongo网站上下载MongoDB,解压到本地目录,比如C:>Mongo
  • 在上一个文件夹内创建数据目录。比如:C:\Mongo\Data
  • 如果数据文件存放在其他地方,那么在用mongod.exe命令启动MongoDB时,需要在命令行加参数—-dbpath
  • 启动服务
  • MongoDB提供了两种方式:mongod.exe以后台进程启动;mongo.exe启动命令行界面,可做管理操作。这两个可执行文件都位于Mongo\bin目录下;
  • 进入Mongo安装目录的bin目录下,比如:C:> cd Mongo\bin
  • 有两种启动方式,如下:

    mongod.exe –dbpath C:\Mongo\data或者 mongod.exe –config mongodb.config mongodb.config是Mongo\bin目录下的配置文件,需要在此配置文件中指定数据目录(比如,dbpath= C:\Mongo\Data)的位置。
  • 连接到MongoDB,到这一步,mongo后台服务已经启动,可以通过:27017查看。 MongoDB启动运行后,我们接下来看它的聚合函数。

  • 实现聚合函数

    在关系数据库中,我们可以在数值型字段上执行包含预定义聚合函数的SQL语句,比如,SUM()、COUNT()、MAX()和MIN()。但是在MongoDB中,需要通过MapReduce功能来实现聚合以及批处理,它跟SQL里用来实现聚合的GROUP BY从句比较类似。下一节将描述关系数据库中SQL方式实现的聚合和相应的通过MongoDB提供的MapReduce实现的聚合。

    为了讨论这个主题,我们考虑如下所示的Sales表,它以MongoDB中的反范式形式呈现。

    Sales表

    #

    列名

    数据类型

    1

    OrderId

    INTEGER

    2

    OrderDate

    STRING

    3

    Quantity

    INTEGER

    4

    SalesAmt

    DOUBLE

    5

    Profit

    DOUBLE

    6

    CustomerName

    STRING

    7

    City

    STRING

    8

    State

    STRING

    9

    ZipCode

    STRING

    10

    Region

    STRING

    11

    ProductId

    INTEGER

    12

    ProductCategory

    STRING

    13

    ProductSubCategory

    STRING

    14

    ProductName

    STRING

    15

    ShipDate

    STRING

    基于SQL和MapReduce的实现

    我们提供了一个查询的样例集,这些查询使用聚合函数、过滤条件和分组从句,及其等效的MapReduce实现,即MongoDB实现SQL中GROUP BY的等效方式。在MongoDB存储的文档上执行聚合操作非常有用,这种方式的一个限制是聚合函数(比如,SUM、AVG、MIN、MAX)需要通过mapper和reducer函数来定制化实现。

    MongoDB没有原生态的用户自定义函数(UDFs)支持。但是它允许使用db.system.js.save命令来创建并保存JavaScript函数,JavaScript函数可以在MapReduce中复用。下表是一些常用的聚合函数的实现。稍后,我们会讨论这些函数在MapReduce任务中的使用。

    聚合函数

    Javascript 函数

    SUM

    db.system.js.save( { _id : "Sum" , value : function(key,values) { var total = 0; for(var i = 0; i < values.length; i++) total += values[i]; return total; }});

    AVERAGE

    db.system.js.save( { _id : "Avg" , value : function(key,values) { var total = Sum(key,values); var mean = total/values.length; return mean; }});

    MAX

    db.system.js.save( { _id : "Max" , value : function(key,values) { var maxValue=values[0]; for(var i=1;i

    MIN

    db.system.js.save( { _id : "Min" , value : function(key,values) { var minValue=values[0]; for(var i=1;i

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。