MongoDB复杂的MapReduce视频日志

时间:2012-11-22 10:02:58

标签: mongodb mapreduce

我有一个来自视频流日志的数据集。每个视频都由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"
}

1 个答案:

答案 0 :(得分:0)

您可以使用单个MapReduce作业执行此操作。

地图功能将视频ID作为键发布,并将值作为一个由单个字段组成的对象。字段名称是带宽,值是当前条目的运行时间。

缩小功能总结送到它的对象。它迭代values数组,在每个数组条目上执行foreach循环,并将每个字段的值添加到返回值中的同名字段中。

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