繁体   English   中英

视频日志的MongoDB复杂MapReduce

[英]MongoDB complex MapReduce of video logs

我有来自视频流日志的数据集。 每个视频都由FileGUID标识。 日志条目记录FileGUID,观看的视频片段以及观看的带宽。

我想创建一个mapreduce,为每个视频输出总计和每个带宽的片段计数。 理想的情况是:

{"FileGUID":"50acb3a5796634df0e073285",
  {
    "1":{"total":76, "0832":34, "1028":42},
    "2":{"total":42, "0832":28, "1028":14},
    ...
  }
}

一个mapreduce是否可能做到这一点?或者它是一个多步骤的过程?还是我应该使用其他方法?

这是数据样本。

{
  "_id": ObjectId("50acb3a5796634df0e073285"),
  "IP": "46.7.1.88",
  "DateTime": ISODate("2012-10-24T22:59:57.0Z"),
  "FileGUID": "8cdde821fb934a6da7c125a012a26612",
  "Bandwidth": NumberInt(1028),
  "Segment": NumberInt(1),
  "Fragment": NumberInt(237),
  "Status": NumberInt(200),
  "Size": NumberInt(576790),
  "UserAgent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko\/20100101 Firefox\/16.0"
}
{
  "_id": ObjectId("50acb3a5796634df0e073284"),
  "IP": "46.7.1.88",
  "DateTime": ISODate("2012-10-24T22:59:52.0Z"),
  "FileGUID": "8cdde821fb934a6da7c125a012a26612",
  "Bandwidth": NumberInt(1028),
  "Segment": NumberInt(1),
  "Fragment": NumberInt(236),
  "Status": NumberInt(200),
  "Size": NumberInt(577100),
  "UserAgent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko\/20100101 Firefox\/16.0"
}
{
  "_id": ObjectId("50acb3a5796634df0e073283"),
  "IP": "46.7.1.88",
  "DateTime": ISODate("2012-10-24T22:59:47.0Z"),
  "FileGUID": "8cdde821fb934a6da7c125a012a26612",
  "Bandwidth": NumberInt(0832),
  "Segment": NumberInt(1),
  "Fragment": NumberInt(234),
  "Status": NumberInt(200),
  "Size": NumberInt(576664),
  "UserAgent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko\/20100101 Firefox\/16.0"
}
{
  "_id": ObjectId("50acb3a5796634df0e073282"),
  "IP": "46.7.1.88",
  "DateTime": ISODate("2012-10-24T22:59:42.0Z"),
  "FileGUID": "8cdde821fb934a6da7c125a012a26612",
  "Bandwidth": NumberInt(0832),
  "Segment": NumberInt(1),
  "Fragment": NumberInt(233),
  "Status": NumberInt(200),
  "Size": NumberInt(575692),
  "UserAgent": "Mozilla\/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko\/20100101 Firefox\/16.0"
}

您可以使用一个MapReduce作业来完成此操作。

映射功能发出视频ID作为键,而值则是由单个字段组成的对象。 字段名称是带宽,值是当前条目的运行时间。

reduce函数对馈入它的对象求和。 它迭代values数组,对每个数组项进行foreach循环,并将每个字段的值添加到返回值中具有相同名称的字段中。

finalize函数对结果对象执行foreach循环,并计算其中的所有条目的总和。 然后,将总和作为字段“总计”放入对象中(永远不要更改当前正在循环的对象)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM