原始数据如下:

u1  a,d,b,c
u2  a,a,c
u3  b,d
u4  a,d,c
u5  a,b,c

计算公式使用:sim = U(i)∩U(j) / (U(i)∪U(j))

其中: (U(i)∪U(j)) = U(i) + U(j) -  U(i)∩U(j)

原始的Hadoop实现需要5轮MR,优化后只需要两轮就可以完成。

之前的轮数过多,主要在于计算(U(i)∪U(j)) 的时候,需要多次更改key,并非计算量大。只需要修改一下传递的key,就可以两轮实现。

mapper_1.py

#!/usr/bin/python
#-*-coding:utf-8-*-
import sysfor line in sys.stdin:user,item_str = line.strip().split()item_list = sorted(list(set(item_str.split(','))))print "item_str:",item_str,"item_list:",item_listfor i in range(len(item_list)):i1 = item_list[i]print i1,1,'norm'for i2 in item_list[i+1:]:print i1,i2,1,'dot'

reducer_1.py

#!/usr/bin/python
#-*-coding:utf-8-*-
import sysdef PrintOut():i1 = old_keyprint i1,old_dict['norm'],'norm'for i2 in old_dict['dot']:print i1 + "-"  + i2,old_dict['dot'][i2],old_dict['norm'],'dot-norm_i1'old_key = ""
old_dict = {'norm':0,'dot':{}}
for line in sys.stdin:sp = line.strip().split()if sp[-1] == 'norm':key,value = sp[:2]if key == old_key:old_dict['norm'] += int(value) else:if old_key != "":PrintOut()old_key = key# Notice: norm part should be int(value)old_dict = {'norm':int(value),'dot':{}}elif sp[-1] ==  'dot':key,i2,value = sp[:3]if key == old_key:if i2 not in old_dict['dot']:old_dict['dot'][i2] = 0old_dict['dot'][i2] += int(value)else:if old_dot_key != "":PrintOut()old_key = keyold_dict = {'norm':int(value),'dot':{}}if old_key != "":PrintOut()

mapper_2.py

#!/usr/bin/python
#-*-coding:utf-8-*-
import sysfor line in sys.stdin:sp = line.strip().split()if sp[-1] == 'norm':print line.strip()elif sp[-1] == "dot-norm_i1":key,dot,norm_i1 = sp[:3]i1,i2 = key.split('-')print i2,i1,dot,norm_i1,'dot-norm_i1'

reducer_2.py

#!/usr/bin/python
#-*-coding:utf-8-*-
import sysdef GenSim(norm_i1,norm_i2,dot):return float(dot) / (int(norm_i1) + int(norm_i2) - int(dot))def PrintOut():i2 = old_keynorm_i2 = old_dict['norm']for i1 in old_dict['dot']:dot,norm_i1 = old_dict['dot'][i1]sim = GenSim(norm_i1,norm_i2,dot)print i1+"-"+i2,dot,norm_i1,norm_i2,sim,'dot,norm_i1,norm_i2,sim'old_key = ""
old_dict = {'norm':"",'dot':{}}
for line in sys.stdin:sp = line.strip().split()if sp[-1] == 'norm':key,value = sp[:2]if key == old_key:old_dict['norm'] = valueelse:if old_key != "":PrintOut()old_key = keyold_dict = {'norm':value,"dot":{}}elif sp[-1] == 'dot-norm_i1':key,i1,dot,norm_i1 = sp[:4]  #key is i2.if key == old_key:if i1 not in old_dict['dot']:old_dict['dot'][i1] = (dot,norm_i1)else:if old_key != "":PrintOut()old_key = keyold_dict = {'norm':value,'dot':{i1:(dot,norm_i1)}}if old_key != "":PrintOut()

执行脚本 t.sh:

#!/bin/bashcat user_log.txt |./mapper_1.py |sort -k1 > d.m.1
cat d.m.1 |./reducer_1.py > d.r.1cat d.r.1 |./mapper_2.py |sort -k1 > d.m.2
cat d.m.2 |./reducer_2.py > d.r.2

itemcf的hadoop实现优化(Python)相关推荐

  1. rust python扩展_Rust语言优化Python性能案例

    原标题:Rust语言优化Python性能案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一些性能问题,不过 Sentry 工程师分享的在关键模块上用另外一门语言 Rust ...

  2. hadoop程序开发 --- python

    这里以统计单词为例 1 首先建立mapper.py mkdir /usr/local/hadoop-python cd /usr/local/hadoop-python vim mapper.py m ...

  3. python程序占用内存高_如何优化Python占用的内存,面试必学

    如果程序处理的数据比较多.比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题.下面我就给出几 ...

  4. 什么是python编程例子_案例详解:优化Python编程的4个妙招

    全文共3510字,预计学习时长7分钟 作为数据科学家,敲出最优的Python代码非常非常重要.别无他法,杂乱低效的代码笔记本会消耗你的时间,也会浪费大量项目资金.经验丰富的数据科学家和专业人士都很清楚 ...

  5. Hadoop之Hadoop企业优化(HDFS小文件优化)

    Hadoop之Hadoop企业优化 目录 MapReduce 跑的慢的原因 MapReduce优化方法之数据输入 MapReduce优化方法之Map阶段 MapReduce优化方法之Reduce阶段 ...

  6. Hadoop企业优化

    Hadoop企业优化 1.1 MapReduce跑的慢的原因 Mapreduce 程序效率的瓶颈在于两点: 1.计算机性能 CPU.内存.磁盘健康.网络 2.I/O 操作优化 (1)数据倾斜 (2)m ...

  7. python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    <从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例>要点: 本文介绍了从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例,希望对您有用.如果有疑问,可 ...

  8. 什么叫python代码的优化_优化Python代码

    如果你的问题是关于优化python代码(我认为应该是这样),那么你可以做各种各样的intesting的事情,但是首先: 你可能不应该痴迷于优化python代码!如果您正在使用最快的算法来解决问题,并且 ...

  9. 转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    注: 转自 微信公众号"高可用架构":从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一 ...

最新文章

  1. 1 元秒杀 1000+ 册爆款电子书,错过再等一年!
  2. SpringBoot集成Swagger-Bootstrap-UI,页面更清爽!
  3. SpringMVC_实现简单的增删改查
  4. Activiti工作流从入门到入土:工作流简介
  5. 内存对齐的规则以及作用
  6. JavaScript:从此不再怕闭包
  7. package javax.servlet.jsp.tagext does not exist的错误消息如何解决
  8. Linux 命令之 localectl -- 控制系统的本地化与键盘布局
  9. 静态代理设计与动态代理设计
  10. mysqldump只导出数据或者只导出表结构
  11. 自学python能干些什么副业-她把摄影当副业:月薪3000,副业收入上万
  12. C语言学习资料汇集 助你成为更好的程序员
  13. 如何学web前端-几款前端小游戏推荐
  14. 老罗Android开发视频教程 (android常用布局介绍)5集集合
  15. Android WorldWind的使用与添加Geoserver影像(一)
  16. C++入门——实现十字消除游戏
  17. 短视频从入门到秃头(二)——拍摄第一条短视频
  18. 多传感器融合定位 第十章 基于优化的定位方法
  19. Planned Contrasts and Post hoc Tests 多重检验校正
  20. 怎么用python表白_如何正确使用Python进行表白

热门文章

  1. python中系列的含义_一篇文章让你彻底搞清楚Python中self的含义
  2. 如何用python爬虫薅羊毛_不会Python编程也能用的,薅羊毛软件使用说明
  3. java磁盘读写b 树_原来你是这样的B+树
  4. linux赋予文件夹所有权限_linux – 如何将某些用户权限仅授予子文件夹
  5. 文本编辑器中实现设置工具栏和状态栏可见性的功能
  6. linux限制pptp连接数_性能调优,让你的服务器更强大!增加TCP连接最大限制
  7. php记录网站访问,PHP简单实现记录网站访问量的功能
  8. php docker开发环境,使用Docker的PHP开发环境
  9. C++继承时的对象内存位置(一)
  10. python h5游戏_从零开始制作H5人脸融合小游戏