实验十 mongodb 聚合函数mapreduce代码学习

环境介绍

  • 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
                     }
                   )

第二题目代码解释

  1. mapFunction2 函数:

    • 这是 Map 阶段的函数,用于处理集合中的每个文档。对于每个文档,它迭代该文档中的 items 数组。
    • 对于每个 items 数组中的元素,它从中提取 sku(库存单位)作为键,并创建一个包含 countqty 属性的值对象,其中 count 初始化为 1,qty 设置为该 items 元素的 qty 值。
    • 然后,通过 emit(key, value) 函数将键-值对发射出去。这样,每个 sku 将作为键,与一个对象关联,该对象包含 countqty 属性。
  2. reduceFunction2 函数:

    • 这是 Reduce 阶段的函数,用于合并具有相同键的值。在这里,键是 sku,值是 countqty 的对象数组。
    • 函数初始化 reducedVal 对象,包含 countqty 属性,初始值都为 0。
    • 然后,它迭代传递给它的值数组,并将 countqty 属性的值相加,以便将它们合并成一个对象。
    • 最后,它返回合并后的 reducedVal 对象。
  3. finalizeFunction2 函数:

    • 这是在 Reduce 阶段之后执行的最终化函数,用于对最终结果进行处理。在这里,它计算了平均值。
    • 函数接收一个键(key)和 Reduce 阶段产生的最终化值(reducedVal)。
    • 它通过将 qty 除以 count 计算出平均值,并将结果添加到 reducedVal 对象中的 avg 属性。
    • 最后,它返回带有 avg 属性的 reducedVal 对象。
  4. 执行 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 的平均数量的信息。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elik-hb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值