首页 > 其他 > 详细

Underscore之Map Reduce

时间:2014-03-29 05:42:55      阅读:454      评论:0      收藏:0      [点我收藏+]

最近想找个Node.js的经典模块阅读阅读,一来磨练一下Javascript技能,二来加深对Node.js的理解。打开Node.js的registry页面,发现Underscore被使用的最多。开始阅读Underscore源码,很快就崩溃了,obj.length === +obj.length,想死有没有?后来在stackoverflow上面找到答案。一路下来,对于我这个Java程序员来说,艰辛啊。以后谁还说javascript简单,我只有一个字,滚。javascript语法确实简单,但能延伸出无限种可能和用法,相信其中的一部分Brendan Eich大神设计javascript的时候也没有想到。

吐槽完毕,生活还得继续。Underscore是一个常用函数类库,说白了,就是弥补javascript语言自身缺失的某些常用功能,在Node.js(Server)和浏览器(Client)环境都可以使用。值得一提的是,如果环境已经提供了此类函数,Underscore会直接委托给环境处理,兼顾了效率和普适性。

对里面的两个函数map和reduce比较感兴趣,原因很简单,容易联想到Hadoop里面的Map Reduce(哈哈,真实的故事是Jeff Dean受函数式编程的启发而发明了大数据的Map Reduce)。算是循着伟人走过的路走走吧,展示一下如何通过函数式编程的Map Reduce统计字母出现频率,说实话,和Hadoop里面的Map Reduce思想还是非常接近的。

故事的开始

我是在Node.js环境执行的,先要引入Underscore模块:

var score = require(‘underscore‘);

统计需要一个样本,这里就用一段简单的文字啦。

 var words = ‘Also known as inject and foldl reduce boils down a list of values into a single value.‘+
                ‘ Memo is the initial state of the reduction, and each successive step of it should be ‘+
                ‘returned by iterator. The iterator is passed four arguments: the memo, then the value ‘+
                ‘and index (or key) of the iteration, and finally a reference to the entire list.‘;

Map

Map的过程就是拆分任务的过程,把一个大的任务拆分为多个小的任务,单独处理。老板需要一份数据,吩咐手下的几个小兵,每个人分一个独立的模块,各自处理。这里的小任务应该处理逻辑相同,处理数据不同。至于各个小任务能否并行执行,要看环境。Node.js是单线程的,显然不会并行处理,这相当于老板只有一个属下,分多次安排给同一个属下小任务而已。Hadoop里面小任务一般情况在多个机器上面执行,显然并行处理,相当于老板有很多个属下,大家同时处理任务。先把段落拆分为单词,然后以单词为单位进行统计,统计结果放到一个map(事实上是一个object)里面。

 var string_array = words.split(/[\s]/);

    console.log(string_array);

    var mapped = score.map(string_array, function(element, index){
	    var stat = {};

	    if(element){
		    for(var i=0; i<element.length; i++){
			    var c = element.charAt(i);
			    if(c.match(/\w/)){
				    if(stat[c]){
					    stat[c] += 1;
				    }else{
					    stat[c] = 1;
				    }
			    }
		    }
	    }

	    return stat;
    });

    console.log();
    console.log(mapped);

Reduce

Reduce就是一个汇总的过程,老板要看的是一个汇总的结果。汇总的时候需要一个地方来存储临时的汇总结果,备忘录(memo)就用来干这一件事情,memo也是个map,初始值为空。

var reduced = score.reduce(mapped, function(memo, element, index){
	    score.each(element, function(value, key, list){
		    if(memo[key]){
			    memo[key]+=value;
		    }else{
			    memo[key]=value;
		    }
	    });

	    return memo;
    }, {});

    console.log();
    console.log(reduced);

参考链接

Underscor官网

Underscore之Map Reduce,布布扣,bubuko.com

Underscore之Map Reduce

原文:http://blog.csdn.net/kimylrong/article/details/22414355

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!