本文概述
在当今数据驱动的世界中, 研究人员正忙于使用数据回答有趣的问题。在海量数据的情况下, 处理和分析数据是一项巨大的挑战。特别是对于没有时间投资于学习由Hadoop生态系统, Spark或NoSQL数据库提供的商业智能平台或技术来帮助他们在几分钟内分析数TB数据的统计学家或数据分析师。
今天的规范是供研究人员或统计人员在R, MATLAB或Octave等分析包中的数据子集上建立模型, 然后将公式和数据处理步骤提供给IT团队, 然后由他们构建生产分析解决方案。
这种方法的一个问题是, 如果研究人员在对生产中的所有数据运行模型后发现新的东西, 则必须重新重复该过程。
如果研究人员可以与MongoDB开发人员合作并对所有生产数据进行分析并将其用作他的探索性数据集, 而不必学习任何新技术, 复杂的编程语言甚至SQL, 该怎么办?
如果我们有效地使用MongoDB的Aggregation Pipeline和MEAN, 我们可以在相当短的时间内实现这一目标。通过本文以及该GitHub存储库中可用的代码, 我们想展示实现此目标有多么容易。
市场上的大多数商业智能工具都为研究人员提供了从NoSQL和其他大数据技术导入数据集的方法, 然后在工具内部进行了转换和分析。但是在此商业智能教程中, 我们使用了MongoDB聚合管道的功能, 而没有将数据从MongoDB中提取出来, 并且研究人员正在使用一个简单的界面在生产大数据系统上进行各种转换。
MongoDB商业智能聚合管道
简而言之, MongoDB的聚合管道是一个框架, 可以对数据集执行一系列数据转换。第一个阶段将整个文档集合作为输入, 然后从每个后续阶段开始, 将上一个转换的结果集作为输入, 并生成一些转换后的输出。
聚合管道中可以使用10种类型的转换:
-
$ geoNear:按距指定点最近到最远的顺序输出文档
-
$ match:过滤任何给定表达式设置的输入记录
-
$ project:使用输入字段或计算字段的子集创建结果集
-
$ redact:根据文档中的信息限制文档的内容
-
$ unwind:从文档中获取包含n个元素的数组字段, 并返回n个文档, 并将每个元素添加到每个文档中, 作为替换该数组的字段
-
$ group:按一个或多个列分组并在其他列上执行聚合
-
$ limit:从输入集中选择前n个文档(用于百分位计算等)
-
$ skip:忽略输入集中的前n个文档
-
$ sort:按照给定的对象对所有输入文档进行排序
-
$ out:获取上一阶段返回的所有文档, 并将它们写入集合
除了上面列表中的第一个和最后一个, 没有关于可以应用这些转换的顺序的规则。 $ out应该只使用一次, 最后, 如果我们要将聚合管道的结果写入新的或现有的集合中, 则应该使用$ out。 $ geoNear只能用作管道的第一阶段。
为了使事情更容易理解, 让我们浏览两个数据集和与这些数据集有关的两个问题。
按职务的薪金差异
为了说明MongoDB聚合管道的功能, 我们下载了一个数据集, 其中包含整个美国大学教学人员的工资信息。该数据可从nces.ed.gov获得。我们拥有来自7598个机构的数据, 这些数据包括以下字段:
var FacultySchema = mongoose.Schema({
InstitutionName : String, AvgSalaryAll : Number, AVGSalaryProfessors : Number, AVGSalaryAssociateProfessors : Number, AVGSalaryAssistantProfessors : Number, AVGSalaryLecturers : Number, AVGSalaryInstructors : Number, StreetAddress : String, City : String, State : String, ZIPCode : String, MenStaffCount : Number, WomenStaffCount : Number
}
借助这些数据, 我们希望(平均)找出按州划分的副教授和教授薪水之间的差异。然后, 副教授可以意识到在哪种状态下, 他的薪水与教授相近。
为了回答这个问题, 研究人员首先需要清除集合中的不良数据, 因为我们的数据集中有几行/文档, 其中平均薪水为空或空字符串。为了完成数据集的清理, 我们将添加以下阶段:
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}
这将过滤掉在这两个字段中具有字符串值的所有实体。在MongoDB中, 每种类型都用唯一的编号表示-对于字符串, 类型编号为2。
该数据集是一个很好的例子, 因为在现实世界的数据分析中, 工程师通常还必须处理数据清理。
现在我们有了一些稳定的数据, 我们可以继续进行下一阶段, 在该阶段我们将按州平均工资:
{$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}
我们只需要对上述结果集进行预测, 并获得州平均薪水的差异, 如管道的第3阶段所示:
{$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}
这应该使我们从全美7519个教育机构的数据集中得出州一级教授与副教授之间的平均工资差异。为了使解释此信息更加方便, 让我们进行一个简单的排序, 以便通过添加$ sort阶段知道哪个状态的差异最小:
{$sort: { SalaryDifference: 1}}
从该数据集中可以看出, 爱达荷州, 堪萨斯州和西弗吉尼亚州是三个州, 与所有其他州相比, 副教授和教授的薪水差异最小。
为此显示了完整的聚合管道, 如下所示:
[
{$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}, {$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}, {$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}, {$sort: { SalaryDifference: 1}}
]
出现的结果数据集如下所示。研究人员还可以将这些结果导出到CSV, 以便使用Tableau等可视化程序包或通过简单的Microsoft Excel图表对其进行报告。
按就业类型划分的平均工资
我们将在本文中探讨的另一个示例涉及从www.data.gov获得的数据集。鉴于美利坚合众国所有州和地方政府组织的薪资信息, 我们希望计算出每个州全职和兼职”财务管理”员工的平均工资。
数据集已导入, 产生了1975个文档, 每个文档都遵循以下模式:
mongoose.Schema({
State : String, GovernmentFunction : String, FullTimeEmployees : Number, VariationPCT : Number, FullTimePay : Number, PartTimeEmployees : Number, PartTimePay : Number, PartTimeHours : Number, FullTimeEquivalentEmployment : Number, TotalEmployees : Number, TotalMarchPay : Number
}, {collection: 'payroll'});
该问题的答案可能有助于财务管理部门的员工选择最佳状态。使用我们的基于MongoDB聚合器管道的工具, 可以很容易地做到这一点:
在第一阶段, 在GovernmentFunction列上进行过滤以丢弃所有非”财务管理”实体:
{$match:{GovernmentFunction:'Financial Administration'}}
在本教程的下一阶段, 我们将按州对实体进行分组, 并计算每个州的平均全职和兼职工资:
{$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}
最后, 我们将把结果从高收入国家分类到低收入国家:
{$sort: {FTP_AVG: -1, PTM_AVG: -1}}
这应该允许该工具生成以下聚合管道:
[
{$match:{GovernmentFunction:'Financial Administration'}}, {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}, {$sort: {FTP_AVG: -1, PTM_AVG: -1}}
]
运行聚合管道应产生如下结果:
建筑模块
为了构建此商务智能应用程序, 我们使用了MEAN, 它是MongoDB, ExpressJS, AngularJS和NodeJS的组合。
你可能已经知道, MongoDB是无模式文档数据库。尽管它存储的每个文档的大小限制为16MB, 但它的灵活性和性能以及它提供的聚合管道框架使MongoDB非常适合此工具。凭借其全面的文档, MongoDB的入门非常容易。
MEAN的另一个不可或缺的组件Node.js提供了事件驱动的服务器端Javascript环境。 Node.js使用Google Chrome的V8引擎运行Javascript。 Node.js的可扩展性承诺促使许多组织朝着它迈进。
Express.js是Node.js最受欢迎的Web应用程序框架。它使为Web应用程序构建API或任何其他类型的服务器端业务层变得容易。由于它的极简性质, 它非常快, 但也很灵活。
由许多Google工程师创建和维护的AngularJS, 正迅速成为我们可以使用的最受欢迎的前端Javascript框架之一。
MEAN如此受欢迎的原因有两个, 还有我们选择techXplorers进行应用程序开发的原因:
-
该技能组很简单。懂JavaScript的工程师可以跨所有层次学习。
-
前端到业务到数据库层之间的通信都是通过JSON对象进行的, 这为我们节省了在不同层进行设计和开发的大量时间。
总结
在此MongoDB聚合管道教程中, 我们展示了一种经济有效的方法, 为研究人员提供了一种工具, 使他们可以将生产数据用作探索性数据集, 并运行不同的转换集来分析和构建模型。
我们仅用3天就可以端到端开发和部署此应用程序。该应用程序由4位经验丰富的工程师(美国2位, 印度2位)以及一名设计师和自由设计师UX专家组成的团队开发, 帮助我们对界面设计进行了一些思考。在将来的某个时候, 我将花一些时间来解释这种协作水平如何在令人难以置信的短时间内构建出出色的产品。
我们希望你利用MongoDB的聚合管道, 并把权力交给你的研究人员, 他们可以凭借他们的聪明的分析和见解来改变世界。
该应用程序可以在此处现场播放。
评论前必须登录!
注册