问题背景

现在有两份数据,file1是校园新闻版块,每一条新闻点击记录;file2是校园新闻版块使用活跃度高的学生记录。用mr统计出某一天的点击记录里,使用ios/android手机的活跃学生的总的点击次数

原始数据格式如下:

file 1,校园新闻点击记录,记录了每一次学生点击校园新闻的行为

格式:学号\t姓名\t手机端\t新闻id\新闻关键词

20170001 xiaoming android 331 学费

20170002 xiaohong ios 332 食堂

20170003 xiaohua android 333 考研

20170001 xiaoming android 222 评优

20170001 xiaoming android 225 学费

20170003 xiaohua android 111 期末考试

20170002 xiaohong ios 117 空调安装

...

file2,校园新闻活跃学生记录,记录了对校园新闻版块点击活跃度高的学生信息

格式:格式:学号\t姓名\t年龄\t手机端

20170001 xiaoming 20 android

20170002 xiaohong 19 ios

20170001 xiaoqiang 20 android

...

问题分析

1、key的选择:选取学号+手机端共同作为key。学号是用于对是否活跃用户的判断,手机端是用于统计时的分类。注意,这里如果仅仅将手机端作为key有一个坏处,就是key值将只有两种,这样不利于将海量的数据分为多个小部分处理,因此选择学号+手机端共同作为key。

2、关键点:在对每一行数据进行处理时,利用两份数据,做好是否活跃用户的标记;在对同一个key进行处理时,根据前一步处理的结果,判断是否进行累加。

代码实现

1、mapper.py

解析原始数据,将其处理为一系列的键值对(key-value pair),这里选取"学号_手机端"作为key。

import sys

def main():

"""

mapper

"""

for line in sys.stdin:

data = line.strip().split("\t")

if len(data) == 5:

student_id = data[0]

os_name = data[2]

key = student_id + ‘_‘ + os_name

print"\t".join([key,"file1"])

elif len(data) == 4:

student_id = data[0]

os_name = data[-1]

key = student_id + ‘_‘ + os_name

print"\t".join([key,"file2"])

if __name__ == "__main__":

main()

2、reducer.py

由MapReduce框架的机制,同一个key的所有数据都会被传给同一个reducer,同一个reducer可以接受多个键值对。

reducer将相同键的一组值,进行处理产生一组规模更小的值(如累加得到一个值)。

import sys

import json

dic_result = {‘android‘:0, ‘ios‘:0}

pre_key = ""

def post_deal(pre_key):

"""

相同key的数据的处理

"""

global dic

os_name = pre_key.strip.split("\t")[1]

if ‘click‘ in dic and dic[‘click‘] == ‘yes‘ and ‘active‘ in dict and dic[‘active‘] == ‘yes‘:

dic_result[os_name] += 1

def deal(data):

"""

对每一行数据的处理

"""

if data[1] == "file1":

dic[‘click‘] = ‘yes‘

if data[1] == "file2":

dic[‘active‘] = ‘yes‘

def pre_deal():

"""

预处理,如将用于存储同一个key的一组value中间结果的字典置零

"""

global dic

dic = dict()

def main():

"""

reducer

"""

for line in sys.stdin:

data = line.strip().split("\t")

key = data[0]

#当同一个key的数据全部deal完,到下一个key时

if key != pre_key:

if pre_key != "":

#处理同一个key所有数据

post_deal(pre_key)

#处理完成后,预处理准备下一轮处理

pre_deal()

#将pre_key更新为下一个要处理的key

pre_key = key

#将同一个key的一组值按需要进行处理/整合

deal(data)

#处理最后一个key的数据

if pre_key != "":

post_deal(pre_key)

#打印结果

print json.dumps(dic_result)

if __name__ == "__main__":

main()

3、线下测试 cat file|map|sort|reduce

STEP1:测试map

cat file1_test file2_test | python mapper.py > map_out

测试中,map_out中的数据将如下所示:

20170001_andorid file1

20170002_ios file1

20170003_andorid file1

20170001_andorid file1

...

20170001_andorid file2

20170002_ios file2

...

STEP2:对map_out按照key(key默认放在第一列)排序,使相同key的数据在一起,然后测试reducer

cat map_out |sort -k1,1|python reducer.py > red_out

reducer的输出是json,形如:{‘ios‘:1123, ‘android‘:3333}

4、hadoop线上运行 run.sh

#!/bin/bash

WORKROOT="..."

HADOOP="hadoop客户端路径"

INPUT1="file1文件路径"

INPUT2="file2文件路径"

OUTPUT_DIR="输出的HDFS路径"

PYTHON="python路径"

#设置一系列参数,并启动MR任务

$HADOOP streaming -D mapred.map.tasks=200 -D mapred.job.map.capacity=400 -D mapred.red.tasks=100 -D mapred.job.red.capacity=400 -D mapred.job.priority=HIGH -D stream.num.map.output.key.fields=1 ...

-partitionor ... -cacheArchive ... -input $INPUT1 -input $INPUT2 -output $OUTPUT_DIR -mapper "$PYTHON mapper.py" -reducer "$PYTHON reducer.py" -file $WORKROOT/mapper.py -flle $WORTROOT/reducer.py

#成功运行完成,创建一个空文件,加上成功的标签

if [ ${?} -eq 0 ]; then

$HADOOP fs -touchz $OUTPUT_DIR succuss.tag

部分参数的解释:

mapred.map.tasks:map数目

mapred.reduce.tasks:reduce数目

mapred.job.map.capacity:map并发数目

mapred.job.reduce.capacity:educe并发数目

stream.num.map.output.key.fields:设置map程序分隔符的位置,该位置之前的部分作为key,之后的部分作为value

mapreduce python实例_MapReduce程序实例(python)相关推荐

  1. python协同过滤调用包_简单的python协同过滤程序实例代码

    本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...

  2. python脚本编程实例_C程序调用Python脚本的例子

    下面我们一起来看看关于C程序调用Python脚本的例子,如果你对此有兴趣的希望此教程对各位同学会有所帮助. 代码如下 复制代码 #include int main(){ PyObject * g_pM ...

  3. python网络爬虫程序技术,Python网络爬虫程序技术

    spContent=该课程是2018年广东省精品在线开放课程.课程主要以爬取学生信息.爬取城市天气预报.爬取网站图像.爬起图书网站图书.爬取商城网站商品等5个项目为依托,讲解Web.正则表达式.Bea ...

  4. python如何在没有环境的电脑上执行_没安装python的电脑可以运行python写的程序吗 python语言编写的程...

    py2exe 能够把 Python script 转换成可以在windows上独立执行的(即不需安装Python)的exe程序(加上其它必需的运行时函数库). -- 摘自百度知道 py2exe能够把P ...

  5. python有趣小程序 表白-python表白小程序

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. # tkinter是python的标准gui(图形用户界面)库 ,pyt ...

  6. python安卓应用程序开发,python怎么开发安卓app

    python可以写软件么怎么写? 22点24分准时推送,第一时间送达编辑:技术君 | 来源:youerning上一篇:正文前言用 Python 写安卓 APP 肯定不是最好的选择,目前用Java和 k ...

  7. python微信小程序实例制作入门_python flask零基础打造微信小程序实战教程

    资源目录: ├─python3+flask │ ├─第1章 介绍 │ └─1-1 导学--Python Flask 构建微信小程序.mp4 │ ├─第2章 微信小程序介绍 │ ├─2-1 小程序是什么 ...

  8. python微信小程序实例_python+Mysql写微信小程序后台

    python比较简单,学了用处比较多,所以推荐写微信小程序的后台. (php.java等做后台太复杂了,学起来费劲) [0--假设] 1.Python开发环境已经搭好了,我这边喜欢用VScode. 2 ...

  9. python编写小程序实例_python小程序开发实例

    商品和服务质量,是用户最关心的,运营者要保证质量,并把用户的完整信息的质量传达给用户,将影响用户的留存与转化的. 再小的店也有自己的品牌!一张小程序码可以让消费者看到你店里的详细经营情况和折扣优惠卷, ...

最新文章

  1. iOS架构设计-URL缓存(上)
  2. WCF wsHttpBinding之Transport security Mode, clientCredentialType=”Basic”
  3. Error:Java home supplied via 'org.gradle.java.home' is invalid
  4. 【html、css、jq】制作一个简洁的音乐播放器
  5. uart——51程序
  6. catboost进行分类并开启GPU模式
  7. QT编程中遇到的问题总结
  8. asp 执行 exe_EXE程序加密锁下载-EXE程序加密锁电脑版下载v5.0
  9. SpringBoot2.0 Actuator 监控参数说明
  10. 强行终止python_中国的真实离婚率:一点也不高,反而低的惊人 | 用python计算离婚率...
  11. DOM解析和SAX解析对比
  12. 记录下ES6踩过的坑
  13. SVN客户端使用详细
  14. Android帧动画分析
  15. matlab 颜色半透明,使用matlab画半透明椭圆
  16. 抖音电商直播基地项目运营规划商业品牌计划书方案模板
  17. 00007__文本编辑器__UltraEdit
  18. PHP做后端编程的入门
  19. 安卓app开发-03-项目的基本开发步骤
  20. Bilibili for mac 2019 - 国内知名的视频弹幕社区软件(b站)

热门文章

  1. html语言难不难学,Web前端开发难学吗?
  2. 什么?超过60%的开发者都开始从Java 8 升级到 Java 11了?
  3. 皮一皮:叫车就要叫这样的,霸气...
  4. 殊途同归!招聘软件与社交软件最终都要走向约P宿命?
  5. StackOverflow热帖:Java整数相加溢出怎么办?
  6. 深度剖析RabbitMQ可靠性消息投递以及实践方案
  7. Windows 命令行终端 PowerShell 美化计划
  8. php vsftpd文件上传类,php ftp文件上传函数(基础版)
  9. ps随机排列_漂亮!自然材料:人工可控微米级胶体粒子“堆积木”——粒子随心所欲的组装排列!...
  10. 用计算机写试卷反思,100分试卷反思怎么写