时间序列数据和MongoDB:第三部分 - 查询,分析和呈现时间序列数据

作者:Robert Walters

译者:刘东华 (Martin Liu)

时间序列数据和MongoDB中:第一部分 - 简介 我们回顾了您需要了解的关键问题,以了解数据库的查询访问模式。在 时间序列数据和MongoDB:第二部分 - 模式设计最佳实践中, 我们探讨了时间序列数据的各种模式设计选项以及它们如何影响MongoDB资源。在这篇博文中,我们将介绍如何查询,分析和呈现MongoDB中存储的时间序列数据。了解客户端如何连接以查询数据库将有助于指导您设计数据模型和最佳数据库配置。查询MongoDB有多种方法。您可以使用本机工具(如 MongoDB Shell 命令行)和 MongoDB Compass(基于GUI的查询工具)。通过一系列以编程方式访问MongoDB数据 MongoDB驱动程序。几乎所有主要的编程语言都有驱动程序,包括C#,Java,NodeJS,Go,R,Python,Ruby等等。

MongoDB还通过使用提供第三方BI报告工具集成 MongoDB BI Connector。流行的基于SQL的报告工具(如Tableau,Microsoft PowerBI,QlikView和TIBCO Spotfire)可以直接在MongoDB中利用数据,而无需将ETL数据导入另一个用于查询的平台。 MongoDB Charts目前处于测试阶段的提供了一种可视化MongoDB数据的最快方式,无需第三方产品或扁平化数据,因此可以通过基于SQL的BI工具读取。

在本博客中,我们将介绍使用上述工具查询,分析和呈现时间序列数据。

与聚合框架查询

MongoDB聚合框架允许开发人员表现执行数据准备,转换和分析的功能管道。这是通过使用执行特定阶段的操作来完成的,例如分组,匹配,排序或加工数据。流经阶段的数据及其相应的处理称为聚合管道。从概念上讲,它类似于通过Unix shell命令行管道的数据流。数据从前一阶段输入,执行工作,并且阶段的输出用作下一个处理阶段的输入,直到管道结束。图1显示了数据如何流经由匹配和组阶段组成的管道。

图1:通过聚合管道的示例数据流

$match是第一阶段在这两个阶段的管道中。 $match将整个订单集合作为输入,并提供一个过滤器,其中包含文档列表,其中“status”包含“A”值。第二阶段将这些过滤后的文档作为输入,并执行数据分组以产生所需的查询结果作为输出。虽然这是一个简单的示例,但请记住,您可以构建极其复杂的处理流水线,利用超过25个不同阶段类的100多个运算符,允许您执行转换,编辑,排序,分组,匹配,分面搜索,图形遍历和在不同的集合之间加入,仅举几例。您可以使用其他分布式数据库无法实现的方式处理数据。

通过我们的时间序列数据,我们将使用MongoDB Compass发出一个即时查询,查询给定股票的当日高价。 Compass是GUI工具,可让您轻松浏览数据。一个有用的功能是通过将数据处理阶段组装到画布上,然后将生成的管道导出为用于复制和粘贴到应用程序的代码,从而可视化地构建聚合管道。

寻找给定股票的日高价

在深入查询本身之前,请回想一下,在第2部分中本文章系列的为我们想跟踪的5只股票生成了1个月的股票价格数据。创建的两个集合中的一个称为“StockDocPerMinute”(PerMinute),它包含一个文档,表示特定股票代码的一分钟数据,如下所示。

考虑应用程序随时间要求给定股票代码的日高价的情况。如果没有聚合框架,则必须通过将所有数据检索回应用程序并使用客户端代码计算结果或通过在Javascript中定义map-reduce函数来完成此查询。从性能或开发人员角度来看,这两种选择都不是最佳选择。

请注意,示例文档有一个子文档,其中包含整个分钟间隔的数据。使用聚合框架,我们可以通过使用将子文档转换为数组轻松处理此子文档 $objectToArray 表达式,计算最大值并得出所需结果,。

使用MongoDB Compass,我们可以使用Aggregation Pipeline Builder构建查询,如下所示:

图3:第一阶段是$match阶段

图4:第二阶段是$project阶段

图5:第三阶段是$addFields阶段阶段

图6:第四阶段是$group阶段

图7:第五阶段是$sort阶段

我们可以看到最后阶段的输出显示了每天的最大值。使用聚合管道构建器,我们不需要编写代码。作为参考,MongoDB Compass在前面的图中构建的完整查询如下:

利用视图

可以从现有集合或其他视图创建MongoDB只读视图。这些视图充当只读集合,并在读取操作期间按需计算。由于它们显示为另一个集合,因此您可以通过限制对视图的基础集合的访问来添加一层安全性,并为客户端提供对该视图的读取访问权限。如果您想了解有关视图访问控制的更多信息,请阅读博客文章“提供对MongoDB数据的最低权限访问”。

要查看视图的创建方式,请考虑用户要查询股票价格历史记录的方案。我们可以使用createView语法在StockDocPerMinute集合上创建一个视图,如下所示:

由于MongoDB只读视图在运行时具体化,因此每个查询都可以获得最新结果。既然定义了视图,就可以像任何其他集合一样访问它。例如,要使用我们可以发出的视图查询“FB”库存的第一个价格条目:

您还可以将聚合框架与视图一起使用。这是查询特定日期的所有“FB”股票代码数据。

使用第三方BI报告工具查询时间序列数据

用户可能希望利用第三方商业智能报告和分析工具中的现有投资。要使这些SQL语言工具能够在MongoDB中查询数据,您可以使用名为MongoDB BI Connector的中间服务。

图8:使用BI连接器使用您最喜欢的基于SQL的报告工具查询MongoDB数据

BI Connector服务向客户端应用程序提供类似于MySQL服务器的端口,并接受发出SQL查询的客户端连接。然后,BI Connector服务将这些查询转换为MongoDB查询语言(MQL),并将查询提交给MongoDB数据库。从MongoDB返回结果并将其展平为表格结构并发送回SQL语音客户端。图8详细介绍了此流程。

为了说明运行中的MongoDB BI Connector,让我们使用Tableau Desktop和MongoDB BI Connector的时间序列数据。 Tableau Desktop具有MongoDB的连接选项。使用该选项并连接到BI Connector中指定的端口,我们看到Tableau枚举了MongoDB数据库中的表列表。

图9:Tableau中的数据源视图,显示从MongoDB BI Connector返回的信息

这些表实际上是我们的MongoDB中的集合。继续使用Tableau中的Worksheet视图,我们可以使用我们在本文档前面创建的View继续并构建一个显示价格随时间变化的报告。

图10:示例Tableau工作表显示随时间变化的价格

MongoDB图表

在MongoDB中可视化数据的最快方法是使用MongoDB图表。目前可以测试使用,它为用户提供了一个Web控制台,他们可以直接从存储在MongoDB中的数据构建和运行报告。使用图表,没有特殊服务需要运行才能查询MongoDB。也无需将数据移出或将其转换为要查询的其他格式。可以将数据直接作为存储MongoDB的富文档进行查询。与其他只读连接一样,您可以将图表连接到辅助副本节点,从而将分析和报告查询与服务于操作时间序列应用程序的其他群集隔离开来。要查看MongoDB图表如何表示StockGen工具中的数据,请查看价格随时间线图,如图11所示。

图11:显示随时间变化的价格的

MongoDB图表处于测试阶段,因此详细信息和屏幕截图可能与最终版本不同。

使用MongoDB

进行分析除了使用MongoDB聚合框架发布高级分析查询外, MongoDB Connector for Apache 还公开了所有Spark的库,包括Scala,Java,Python和R.这使您可以使用Spark分析引擎进行大数据处理您的时间序列数据可以进一步扩展MongoDB的分析功能,以执行实时分析和机器学习。连接器将MongoDB数据实现为DataFrames和Datasets,以便通过机器学习,图形,流和SQL API进行分析。 Spark连接器利用MongoDB的聚合管道和丰富的二级索引来提取,过滤和处理您需要的数据范围!没有浪费时间提取和加载数据到另一个数据库,以便使用Spark查询您的MongoDB数据!

图12:MongoDBSpark连接器

MongoDB 的 R 语言驱动程序为开发和统计人员提供了一流的体验,包括对MongoDB的本地语言,本机语言访问,企业身份验证以及对BSON数据类型的完全支持。使用R语言可用的扩展库,您可以查询MongoDB时间序列数据并确定局部加权回归,所示。

图13:显示随时间变化的价格和每秒数据平滑的散点图

MongoDB的R驱动程序可通过CRAN R Archive获得。安装完成后,您可以连接到MongoDB数据库并返回可用于R计算的数据帧。上面的图是使用以下代码使用R Studio生成的:

天天天天梯梯梯梯梯梯

总 结

虽然并非所有数据都属于时间序列,但由于允许我们实时而非批量利用数据流的技术推动,其中越来越多的数据可归类为时间序列。在每个行业和每个公司中,都需要查询,分析和报告时间序列数据。实际业务价值来自从数据中获得的分析和见解。 MongoDB使您可以收集,分析和处理环境中的每个时间序列数据。在这三部分系列中,我们介绍了一些针对您的特定应用要求的发人深省的问题。在第二篇博客文章中,我们研究了几种不同的时间序列模式设计及其对MongoDB性能的影响。最后,我们总结了如何使用MongoDB聚合框架和MongoDB Compass查询时间序列数据的系列,以及使用BI连接器和R等分析语言的其他方法。

原型是一回事,但有效处理数TB的数据是不同的场景下的。使用MongoDB,可以轻松地横向扩展时间序列工作负载。通过使用副本集,只读客户端可以连接到副本集辅助节点以执行其查询,使主节点专注于写入。写入繁重的工作负载可以通过分片水平扩展。虽然对MongoDB架构的深入分析超出了这些博客文章的范围,但您可以在找到许多有用的信息: MongoDB Architecture白皮书

物联网(IoT)用例会生成大量的时间序列数据。更大的物联网解决方案涉及支持各种硬件和软件设备以进行数据摄取,支持实时和历史分析,安全性,高可用性以及大规模管理时间序列数据等。 MongoDB正在为全球的关键任务物联网应用提供支持。有关MongoDB物联网的更多信息,请查看 物联网网站

/

译者简介

/

刘东华 (Martin Liu):

野生程序猿, 有 Web 前后端开发经验。

主要方向: 服务器运维, 数据库, 后端开发。

本文分享自微信公众号 - Mongoing中文社区(mongoing-mongoing)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券