2012-11-22 27 views
0

我有一個來自視頻流日誌的數據集。每個視頻都由FileGUID標識。日誌條目記錄FileGUID,觀看的視頻片段以及觀看的帶寬。MongoDB複雜的MapReduce視頻日誌

我想創建一個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" 
} 

回答

0

你可以用一個MapReduce作業來做到這一點。

地圖功能將視頻ID作爲關鍵字發出,並將值視爲包含單個字段的對象。字段名稱是帶寬,該值是當前條目的運行時間。

減少功能總結饋送給它的對象。它迭代values數組,對每個數組條目執行foreach循環,並將每個字段的值添加到返回值中同名的字段中。

最終確定函數對結果對象執行foreach循環,並計算其中所有條目的總和。然後它將總和作爲字段「total」(永遠不會更改您正在循環的對象)。