所有的数据处理都是map-reduce
用reduce求和
const sum = [1,2,3,4,5,6].reduce((v,t)=>{
return v+t;
//第一次v=0,t=1
//第二次v= 0+1,t=2
//第三次v=1+2,t=3......
},0)//reduce传入两个值,第一个是个函数,第二个是初始值
map处理字符串然后用reduce
const joined = 'this-is-an-example';
joined
.split('-')
.map( word => {//用map将每个单词的第一个字符变成大写
const [head,...others] = word
console.log(head,others);
return head.toUpperCase() + others.reduce((x,y) => x+y,'')
})
.reduce( (s,word)=>{
console.log('word=='+word);
return s+' '+word;
})
console.log(joined);
map/reduce处理sql
本质上所有数据处理过程(sql过程)都是map/reduce,所以可以使用map/reduce完成大量操作。而高阶函数让我们可以最大化复用这个计算过程
//所有数据处理都是sql,用map/reduce完成一些sql操作
//假设数据库中有一张成绩单,如下
let students = {
{id:1,name:'lucy',score:99,class:'a'},
{id:2,name:'lily',score:88,class:'b'}
}
let selected = students.map( student => {
return {name:student.name}//最终只会输出name这一字段的值
})
console.log(selected); //比如筛选所有分数大于80的学生 即select name from students where score>80
let selected2 = students.reduce( (list,student) => {
if(student.score > 80){
list = [...list,student]
}
return list;
},[])
console.log(selected2); /*===================================================*/ //对上述条件筛选的另一思路 map/reduce与高阶函数
//先把函数提取出来,此时并没有用到高阶函数
let selectScoreLargerThan80 = (list,student) => {
if(student.score > 80){
list = [...list,student];
}
return list;
}
//const selected_2 = students.reduce(selectScoreLargerThan80,[])
//定义一个高阶函数filter,用于生成筛选条件
const filter = (prediction) => {
return (list,item) => {
if(prediction(item)){
list = [...list,item];
}
}
}
//使用filter增加筛选条件
const selectScoreLargerThan80_2 = filter(item => item.score > 60)
const selected_2_2 = students.reduce(selectScoreLargerThan80,[]) /*=========================================*/
//按照分数排序(倒序)
//插入排序 select * from students order by score desc
const sorted = students.reduce( (list,student) => {
let i = 0;
for(;i<list.length;i++){//这里是插入的过程,排序条件是可变的,所以可以把这部分封装到一个高阶函数
if(list[i].score < student.score) break;
}
return [...list.slice(0,i),student,...list.slice(i,list.length)];//插入排序
},[]) /*========================================*/
//按照班级进行排序(groupby),然后求最大分数,插入排序
// select max(score) from students group by class //将学生按照class分组
const grouped = students.reduce( (groups,student) => {
if(!groups[student.class]){
groups[student.class] = {key:student.class,values:[]}
}
groups[student.class].values.push(student)
return groups
},{})
//提取为数组
const arrGroups = Object.values(grouped);
//计算每个分组的最大值
const final = arrGroups.map(group => {
return {
class:group.key,
max:group.values.reduce( (a,b) => {
return b.score > a ? b.score : a;
},0)
}
})
console.log(final); /*===========================*/
//使用原生的filter与find
const selected = students.filter(student => student.score > 60)
const student = students.find(student => student.id === 5)
const sorted = students.sort((student1,student2) => student1.score < student2.score )
整理自魏蒙老师视频
所有的数据处理都是map-reduce的更多相关文章
- 基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其可视化
文档内容: 1:下载<hadoop权威指南>中的气象数据 2:对下载的气象数据归档整理并读取数据 3:对气象数据进行map reduce进行处理 关键词:<Hadoop权威指南> ...
- Map Reduce和流处理
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由@从流域到海域翻译,发表于腾讯云+社区 map()和reduce()是在集群式设备上用来做大规模数据处理的方法,用户定义一个特定的映射 ...
- Hadoop学习:Map/Reduce初探与小Demo实现
原文地址:https://blog.csdn.net/liyong199012/article/details/25423221 一. 概念知识介绍 Hadoop MapReduce是一个用于处 ...
- hadoop学习WordCount+Block+Split+Shuffle+Map+Reduce技术详解
转自:http://blog.csdn.net/yczws1/article/details/21899007 纯干货:通过WourdCount程序示例:详细讲解MapReduce之Block+Spl ...
- Google的分布式计算模型Map Reduce map函数将输入分割成key/value对
http://www.nowamagic.net/librarys/veda/detail/1768 上一篇 大规模分布式数据处理平台Hadoop的介绍 中提到了Google的分布式计算模型Map R ...
- Hadoop Map/Reduce
Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集.一个Map/Reduce ...
- MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- map reduce
作者:Coldwings链接:https://www.zhihu.com/question/29936822/answer/48586327来源:知乎著作权归作者所有,转载请联系作者获得授权. 简单的 ...
随机推荐
- 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\......”--“拒绝访问。 ”错误
1.通常的解决方法:原因是由于系统目录下的Temp目录无相应的权限所致,具体操作如下: C:\Windows\temp-->属性-->安全-->编辑-->添加NETWORK S ...
- ajax请求成功,但是进入error
ajax请求成功,这是因为json数据没有严格按json格式返回
- 【leetcode】1131. Maximum of Absolute Value Expression
题目如下: Given two arrays of integers with equal lengths, return the maximum value of: |arr1[i] - arr1[ ...
- Oracle12c RAC RMAN异机恢复
######################################################## #编辑pfile文件initspdb.ora vi /oracle/app/oracl ...
- SpringBoot自定义FailureAnalyzer
官网说明 1.1 创建自己的 FailureAnalyzer FailureAnalyzer是一种在启动时拦截 exception 并将其转换为 human-readable 消息的好方法,包含在故障 ...
- Fiddler简介以及web抓包1
一.Fiddler简介 简单来说,Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯.网上简介很多,我们不多说. 二.Fiddler版本 Fiddle ...
- 构建嵌入式Linux交叉编译工具链
开源交叉编译工具链制作方法汇总: 1) 使用crosstool/crosstool-ng生成 2) 使用buildroot生成 ARM交叉编译工具链说明: 1) arm-linux-gcc是一个集合命 ...
- __main__ — Top-level script environment
w 29.4. __main__ — Top-level script environment — Python 3.6.1 documentation https://docs.python.or ...
- iOS即时通讯之CocoaAsyncSocket源码解析五
接上篇:iOS即时通讯之CocoaAsyncSocket源码解析四 原文 前言: 本文为CocoaAsyncSocket Read篇终,将重点涉及该框架是如何利用缓冲区对数据进行读取. ...
- 再说vim 乱码问题
在vimrc设置中, 可以简写: file = f encoding = enc fileencodings = fencs fileencoding = fenc 主要有四个编码, 要了解它们的含义 ...