环境介绍
- Linux: Ubuntu 16.04 LTS
- hadoop2.7
介绍
MongoDB 有两种聚合函数:aggregate 与 mapreduce
mapreduce函数提供的是mapreduce(编程模型)的聚合操作,图例:
先使用随机函数来生成淘宝的购物数据
题目一是简单的mapreduce求和,不加以解释
题目二
1.map函数
var mapFunction2 = function() {
for (var idx = 0; idx < this.items.length; idx++) {
var key = this.items[idx].sku;
var value = {
count: 1,
qty: this.items[idx].qty
};
emit(key, value);
}
};
2.reduce函数
var reduceFunction2 = function(keySKU, countObjVals) {
reducedVal = { count: 0, qty: 0 };
for (var idx = 0; idx < countObjVals.length; idx++) {
reducedVal.count += countObjVals[idx].count;
reducedVal.qty += countObjVals[idx].qty;
}
return reducedVal;
};
3.finalize函数
var finalizeFunction2 = function (key, reducedVal) {
reducedVal.avg = reducedVal.qty/reducedVal.count;
return reducedVal;
};
4.执行mapreduce
db.order_info.mapReduce( mapFunction2,
reduceFunction2,
{
out: { merge: "map_reduce_example" },
finalize: finalizeFunction2
}
)
第二题目代码解释
-
mapFunction2
函数:- 这是 Map 阶段的函数,用于处理集合中的每个文档。对于每个文档,它迭代该文档中的
items
数组。 - 对于每个
items
数组中的元素,它从中提取sku
(库存单位)作为键,并创建一个包含count
和qty
属性的值对象,其中count
初始化为 1,qty
设置为该items
元素的qty
值。 - 然后,通过
emit(key, value)
函数将键-值对发射出去。这样,每个sku
将作为键,与一个对象关联,该对象包含count
和qty
属性。
- 这是 Map 阶段的函数,用于处理集合中的每个文档。对于每个文档,它迭代该文档中的
-
reduceFunction2
函数:- 这是 Reduce 阶段的函数,用于合并具有相同键的值。在这里,键是
sku
,值是count
和qty
的对象数组。 - 函数初始化
reducedVal
对象,包含count
和qty
属性,初始值都为 0。 - 然后,它迭代传递给它的值数组,并将
count
和qty
属性的值相加,以便将它们合并成一个对象。 - 最后,它返回合并后的
reducedVal
对象。
- 这是 Reduce 阶段的函数,用于合并具有相同键的值。在这里,键是
-
finalizeFunction2
函数:- 这是在 Reduce 阶段之后执行的最终化函数,用于对最终结果进行处理。在这里,它计算了平均值。
- 函数接收一个键(
key
)和 Reduce 阶段产生的最终化值(reducedVal
)。 - 它通过将
qty
除以count
计算出平均值,并将结果添加到reducedVal
对象中的avg
属性。 - 最后,它返回带有
avg
属性的reducedVal
对象。
-
执行 MapReduce:
- 最后一部分是实际执行 MapReduce 操作的代码块。
db.order_info.mapReduce()
函数接受三个参数:Map 函数、Reduce 函数和一个选项对象。mapFunction2
是定义的 Map 函数,reduceFunction2
是定义的 Reduce 函数。- 选项对象包括
out
,它指定了 MapReduce 结果的输出位置。在这里,使用merge
选项将结果合并到名为"map_reduce_example"
的集合中。 - 还提供了
finalize
选项,该选项指定了在 Reduce 阶段之后执行的最终化函数。
总结:这段代码执行了一个 MapReduce 操作,用于处理 order_info
集合中的文档,并计算每个不同 sku
的平均数量(qty
)。最终结果将合并到名为 "map_reduce_example"
的集合中。这可以用于数据汇总和分析,以便获取有关不同 SKU 的平均数量的信息。