【翻译】运用MapReduce找到社交媒体中的共同朋友

原文:[url]http://stevekrenzel.com/finding-friends-with-mapreduce[/url]
关于MapReduce的运用,最近阅读到的一篇文章,写的很不错,搬过来分享下。

MapReduce是一种编程模型,用于大数据(>1TB)的并行运算。对于原理可以简化为两个步骤:map(映射)方法和reduce(归约)方法。Map方法是将一个值输出为key-value的对应。比如统计一篇英文文章中某个长度有几个单词。具体思路是输入一个目标句子,那么输出就可以是以目标字符串中的一个单词长度为key,单词本身为value的map。这个map的方法没什么其它的依赖,只需要输入一个单词就可以完成map方法的输出。这样可以进行并行运算。具体如下:
3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

分组整理后:
3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

每行数据会进行reduce方法,即一个特定长度的key会对应一个value的list。再往深入点,我们可能会计算每个特定长度的词有多少个,于是reduce方法将会整理出如下对应关系:
3:3
4:3
5:2
8:2
综上所述就是map方法和reduce方法都可以分N个机器进行并行运算,这样在时间上的优势是很大的。经过以上步骤就分析出某个长度的词汇在文章中出现的次数了。

另一个关于MapReduce的类似例子是统计词语在文章中出现的次数。
首先要做的就是将文章中的词汇逐个转成map,key是这个词汇本身,value默认为1。然后进行分组整理,此时key还是这个词语本身,value是次数为1的集合(list),最后的reduce要做的就是合计value,即将所有的1相加,最终的输出结果就是词语-次数的map。
看起来好像很容易,以上的例子就是MapReduce的“Hello World”。来说说现实生活中的运用MapReduce的例子吧:

社交平台(例如Facebook)会有一个好友的列表(假设这个朋友关系是双向的,即A是B的好友,那么B也必须是A的好友)。平台的优势是大公司不差钱存储空间多,平台每天有几百万次的点击量,所以他们决定提前计算,从而减少请求的时间。比如你和Joe有230个共同好友,当Joe访问你的主页时,他可以看到一个共同好友的列表,这个列表可能不经常改动,所以如果每次访问都实时统计一遍实属浪费资源和时间(当然另一种解决方案是Cache)。这时候可以用mapreduce每天计算朋友之间的共同朋友,并保存下来,这样每次请求的时候就特别方法,虽然占用空间,但便宜。

Assume the friends are stored as Person->[List of Friends], our friends list is then:
假投朋友关系存储是按key-value:某个人->[朋友集合],如下:
A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

每一行都是一个mapper,但是上面的键值是一个朋友的List,而我们要的是两个好友之间的共同朋友,所以基于这个需求,需要将值重新拆成单个key-value的配对(当前这个人与他朋友之间的两两配对),这样就可以变成某个人和特定的朋友之间的关系了。这个健值是有顺序的(便于双向访问的时候用同一个键值,即A访问B的时候是(A B),B访问A的时候也是(A B)),按这个逻辑来重新组合,就变成了如下结果:
For map(A -> B C D) :
(A B) -> B C D:具体说下意思:(A B) -> B C D的意思是A和B是共同好朋友->A的所有的好朋友,下同。
(A C) -> B C D
(A D) -> B C D
For map(B -> A C D E) : (注意键值是有顺序的,即A在B的前面)
(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :
(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :
(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):
(B E) -> B C D
(C E) -> B C D
(D E) -> B C D

在将结果交给reducer进行reduce前,我们先把以上值进行分组(group):
(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)

再进行reduce,这个reduce方法就是取两个集合中的交集。比如reduce((A B) -> (A C D E) (B C D))将输出(A B) : (C D),这意味着A和B的共同朋友有C和D。
(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)
当D访问B的主页时,我们可以迅速的查询键值为(B D)对应的值,即(A C E)。


参考:
维基百科MapReduce主页 [url]https://en.wikipedia.org/wiki/MapReduce[/url]
MapReduce简单实践:两步实现查找共同好友 MapReduce实际应用 - 查找QQ共同好友 阅读详情

相关推荐

使用MapReduce在大数据社交媒体网络中进行社区结构挖掘。

社交媒体网络在人们的日常生活中发挥着越来越重要的作用。 社区结构是社交媒体网络的显着特征之一,已经被应用到推荐系统和网络营销等实际应用中。 随着社交媒体规模的Swift扩大和信息量的激增,如何在大数据场景中识别社区已成为一个挑战。 基于我们以前的工作和地图方程(来自社区挖掘信息理论的方程),我们开发了一种新颖的分布式社区结构挖掘框架。 在框架中,(1)我们提出了一种新的链接信息更新方法,以试图避免数据写入相关的操作并试图加快该过程。 (2)我们使用来自节点及其邻居的本地信息而不是pagerank来计算节点的概率分布。 (3)我们从先前的工作中排除了网络分区过程,并尝试直接在MapReduce上运行map方程。 在现实世界中的社交媒体网络和人工网络上的经验结果表明,新框架在准确性,速度和可伸缩性方面优于我们以前的工作和一些著名的算法,例如Radetal,FastGN。

mapred找共同朋友,数据格式如下

import java.io.IOException; import java.util.Set; import java.util.StringTokenizer; import java.util.TreeSet; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; i

qiezikuaichuan的专栏 694

数通基础(基本网络通信原理、IP地址如何配置、DHCP、DNS域名系统、路由技术基础、静态路由 、TCP和UDP、vlan虚拟局域网、trunk、三层交换)

我们知道了1、电脑开机,通过dhcp获取ip地址2、电脑输入域名,www.baidu.com电脑把www.baidu.com发到自己的dns服务器3、dns服务器把域名解析成对应的ip地址4、电脑向百度服务器发送一个请求。

qq_53235556的博客 6472

mapreduce '找共同朋友',面试题

mapred找共同朋友,数据格式如下: [quote] A B C D E F B A C D E C A B E D A B E E A B C D F A [/quote] 第一字母表示本人,其他是他的朋友,找出有共同朋友的人,和共同朋友是谁 答案如下: [code="java"] import java.io.IOException; i...

疯狂的矩阵 535

ANSYS WB 网格划分详解与技巧

本文详细介绍了网格操作中的关键设置与功能选项。主要内容包括:1)网格显示风格与物理偏好设置;2)单元阶次选择对精度的影响;3)单元尺寸控制方法;4)尺寸调整功能,重点讲解了自适应尺寸调整、增长率控制和捕获曲率等选项;5)网格质量评估标准;6)四种主要划分方法(四面体、六面体主导、扫掠、多区域)的特点与适用场景;7)三种尺寸调整方式(直接调整、边缘尺寸调整、影响范围调整)的具体应用。文章强调在实际建模中需要根据模型特点合理选择网格参数,平衡计算精度与效率。

2403_87939837的博客 1694

如何使用 Ansys OptiSlang 同时运行多个参数化设计研究

了解如何通过使用 OptiSLang 同时运行多个参数化设计研究来提高工作效率。

jkh920184196的博客 2379

mapreduce系列(7)--查找共同好友

一、概述A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D,E,F H:A,C,D,E,O I:A,O J:B,O K:A,C,D L:D,E,F M:E,F,G O:A,H,I,J求出哪些人两两之间有共同好友,及他俩的共同好友都是谁 比如:a-b : c ,e

tianjun2012的专栏 5472

PyTorch深度学习实战(25)——从零开始实现Mask R-CNN实例分割

Mask R-CNN 是一种在目标检测任务中引入了语义分割的强大框架,通过在 Faster R-CNN 基础上进行扩展,添加了额外的分支网络,不仅可以准确地检测对象的位置和类别,还可以生成每个实例的精确像素级别的语义分割掩码。其模块化的设计可以轻松地应用于不同的任务和数据集,并且可以通过添加更多的分支进行功能扩展,如实例关键点检测等。

盼小辉丶的博客 1万+

MapReduce实现寻找共同好友

MapReduce实现寻找共同好友详解

澈彻策的博客 5449

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

【AI编程】Cursor编程工具使用教程:下载、配置、使用、运行Java项目

funfan的博客 5196

python语言字符串练习题

描述:find()方法检测字符串中是否包含子字符串str,如果指定 beg(开始)和end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串,返回字符串中,子字符串第一个字符的索引值,否则返回-1。描述:find()方法用来检测字符串中是否包含子字符串str,在指定范围内,如果包含子字符串,返回字符串中,子字符串第一个字符的位置,否则返回-1。命令行先后输入两个字符串,然后利用find()方法找出第二个字符串在第一个字符串中出现的位置。本关需要你编写一个程序,输出字符串的长度。

国家一级致癌物 2023

Jeff Dean离开Google,Gemini API开发者如何应对?

在大模型应用开发中,API稳定性与模型的可持续演进是团队选型时最关心的工程问题。当核心技术人物发生变动,系统是否会受影响取决于架构设计是否预留了可替换性。本文从大模型API接入原理出发,分析Gemini模型家族的技术基因与工程架构,重点探讨如何通过多模型适配层、标准化调用协议和可量化的评测机制来降低对单一模型的依赖。无论使用Gemini还是其他大模型API,构建灵活的模型管理层、制定科学的模型选型流程,都是保障AI应用长期稳定的关键路径。结合Gemini API的调用实践,帮助开发者建立稳健的工程应对策略。

weixin_30698527的博客 364

RT-DETR改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新260多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-4。项目介绍在大家购买专栏后,加入学习

Limiiiing的博客 2万+

可组合数据团队:AI时代的数据能力模块化实践

在AI驱动业务迭代加速的背景下,传统数据团队的瀑布式协作已难以匹配周级甚至小时级的需求响应节奏。可组合数据团队将数据能力解耦为可独立交付、契约定义、成本可视的模块,本质是面向服务化与工程化的组织范式升级。它依托NL2SQL、Feature Store、智能治理等AI原生工具链,降低基础能力复用门槛,推动数据工程师从ETL执行者转向能力设计者,业务方从需求提报者升级为自助分析者。该模式已在实时推荐、归因分析、动态风控等典型场景落地验证,适用于正面临跨部门协同低效、人才结构代际迁移及AI工具规模化应用挑战的中大

weixin_33806914的博客 360

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于hadoop的社交网络的分析

昨天终于hadoop的项目验收完成了,终于可以松一口气了,总体还是比较满意的。 首先说一下项目流程,用mapreduce对数据进行预处理,然后用mahout中的聚类算法(kmeans)对数据进行处理,最后用peoplerank对数据进行处理。 根据老师交给我们的数据,包括Google+和Twitter的部分社交网络数据。以下是两个数据下载的链接 http://snap.stanford.ed

K-night的专栏 3242

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MapReduce当中寻找用户间的共同好友

寻找用户间的共同好友马克-to-win @ 马克java社区:下面我们给出一个经典的案例:寻找用户间的共同好友。(有意思的是:网上讨论这个案例的虽多,但都有这那的错误,不是数据错就是程序错, 总有同学和我比对,实际和我的是不一样的)马克-to-win @ 马克java社区:下面给出用户的好友关系列表(注意是单向的, 单向的好友意味着,你是别人的好友,别人可能不是你的好友),每一行代表一个用户和他的...

mark_to_win的专栏 487

寻找共同好友实现

import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apach...

Smart_cxr的博客 1148

MapReduce实例——好友推荐

1. 实例介绍 好友推荐算法在实际的社交环境中应用较多,比如qq软件中的“你可能认识的好友”或者是Facebook中的好友推介。好友推荐功能简单的说是这样一个需求,预测某两个人是否认识,并推荐为好友,并且某两个非好友的用户,他们的共同好友越多,那么他们越可能认识。 2. 数据流程 3. 具体实现 3.1 上传数据qq.txt tom cat hadoop hello hello mr tom...

sinat_34045444的博客 5057

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 398

Flink SQL 连接器实战:MySQL Source、Flink CDC 与 JDBC Sink 全解析

提供有界流读取,适合批处理和维表场景,简单直接但无法感知变更。MySQL CDC提供无界流读取,通过「全量快照 + binlog 增量」的方式实现实时捕获,是实时数仓的核心入口,但需要 MySQL 侧正确配置 binlog 和权限。JDBC Sink负责结果回写,关键在于区分仅插入流和更新流,更新流必须依赖主键完成 upsert。掌握这三者的差异,本质上就是掌握了 Flink 中「有界与无界」「追加与更新」这两组最基本的语义。

2401_83857914的博客 415

Elasticsearch ingest pipeline 被禁用之后:性能代价、安全治理与数据入库时间的四种替代方案

生产环境为什么禁用 Elasticsearch ingest pipeline?写入路径同步执行的开销、Painless 脚本的安全治理是根因;而 _ingest.timestamp 出不了 pipeline,ES 8/9 也没有原生入库时间字段。本文给出四种替代方案:采集端注入时间戳、bulk 响应后回写、refresh=wait_for 近似、最小 set pipeline 白名单,附选型对比与踩坑清单。

Sayai的专栏 335

管道检测机器人行业调查、市场规模、排名分析报告2026-2032

全球管道检测机器人市场持续增长,2026年规模达12.63亿美元,预计2032年增至29.06亿美元,复合增长率14.9%。受管网老化、监管趋严及非开挖技术普及推动,市场需求旺盛。产品以轮式和履带式为主,广泛应用于供水、油气等管道检测。行业竞争呈现国际企业主导高端、国内外厂商多元共存格局。未来趋势聚焦AI智能识别、模块化设计、RaaS模式创新及氢能等新兴场景应用,技术升级与标准化建设将成为关键驱动力。

GlobalInfo的博客 229

大数据工具介绍

Hive作为离线数仓的元数据管理与SQL接口,依托HDFS存储、Spark/MapReduce计算;Spark是统一的分布式计算引擎,承担复杂数据处理;DataX实现异构数据源间离线同步;ClickHouse擅长极速单表分析;Doris则提供实时、多表关联的综合分析能力;Flink作为原生流处理引擎,支持毫秒级实时计算与状态管理。两者共同构建起从离线批处理到实时流处理的完整数据链路。

yyk33324的博客 259

Hybrid Search 实战:Elasticsearch BM25 + 向量检索加权融合,把关键词命中补回来

纯向量检索常漏掉型号、错误码、专有名词;本文用 Elasticsearch 的 BM25 与稠密向量做加权融合,给出可复现的 Python 打分与调参思路,把关键词命中稳稳补回来。

llhllq2015的博客 235

Meta 816B 参数 Muse Spark Open 在 NVIDIA GB300 上实现每 GPU 50K tokens 每秒

Meta 推出针对代理编码优化的 816B 参数混合专家模型 Muse Spark Open,支持百万 token 上下文和多模态感知,在 NVIDIA GB300 NVL72 上达到每 GPU 50K tokens 每秒。

wfly blog 162
上一篇: 【总结】Spring LDAP整理
下一篇: 【总结】Matlab调用Java代码
angelbill3
博客等级 码龄18年 3粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值