2012-11-22 5 views
0

비디오 스트리밍 로그의 데이터 세트가 있습니다. 각 비디오는 FileGUID로 식별됩니다. 로그 항목에는 FileGUID, 시청 한 비디오 조각 및 시청 한 대역폭이 기록됩니다.MongoDB complex 비디오 로그의 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 작업으로이 작업을 수행 할 수 있습니다.

map 함수 단일 필드로 구성된 오브젝트와 같은 키 값으로 동영상 ID를 방출한다. 필드 이름은 대역폭이고, 값은 현재 항목의 실행 시간입니다.

reduce 함수은 입력 된 객체를 요약합니다. 값 배열을 반복하고 각 배열 항목에 대해 foreach 루프를 수행하고 각 필드의 값을 반환 된 값의 같은 이름 필드에 추가합니다.

finalize 함수은 결과 객체에 대해 foreach 루프를 수행하고 그 안에있는 모든 항목의 합계를 계산합니다. 그런 다음 합계를 "total"필드로 객체에 넣습니다 (현재 반복하고있는 객체는 변경하지 마십시오).

관련 문제