MapReduce 编程实践:统计对象中的某些属性

文章目录

    • 1. 生成数据
    • 2. 编写实体类
    • 3. Mapper类
    • 4. Reducer类
    • 5. Driver类
    • 6. 运行

参考书:《Hadoop大数据原理与应用》

相关文章:MapReduce 编程实践

1. 生成数据

超市消费者 数据: id, 时间,消费金额,会员/非会员

使用 Python 生成虚拟数据

import random
import time
consumer_type = ['会员', '非会员']
vip, novip = 0, 0
vipValue, novipValue = 0, 0
with open("consumer.txt",'w',encoding='utf-8') as f:for i in range(1000): # 1000条数据random.seed(time.time()+i)id = random.randint(0, 10000)t = time.strftime('%Y-%m-%d %H:%M',time.localtime(time.time()))value = random.randint(1, 500)type = consumer_type[random.randint(0, 1)]f.write(str(id)+'\t'+t+'\t'+str(value)+'\t'+type+'\n')if type == consumer_type[0]:vip += 1vipValue += valueelse:novip += 1novipValue += value
print(consumer_type[0] + ": 人数 " + str(vip) + ", 总金额: " + str(vipValue) +", 平均金额:"+str(vipValue/vip))
print(consumer_type[1] + ": 人数 " + str(novip) + ", 总金额: " + str(novipValue) +", 平均金额:"+str(novipValue/novip))

[dnn@master HDFS_example]$ python test.py
会员: 人数 510, 总金额: 128744, 平均金额:252.439215686
非会员: 人数 490, 总金额: 123249, 平均金额:251.528571429

2. 编写实体类

  • Consumer.java
package com.michael.mapreduce;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Date;public class Consumer implements Writable{private String id;private int money;private int vip; // 0 no, 1 yespublic Consumer() {}public Consumer(String id, int money, int vip) {this.id = id;this.money = money;this.vip = vip;}public int getMoney() {return money;}public void setMoney() {this.money = money;}public String getId() {return id;}public void setId(String id) {this.id = id;}public int getVip() {return vip;}public void setVip(int vip) {this.vip = vip;}public void write(DataOutput dataOutput) throws IOException{dataOutput.writeUTF(id);dataOutput.writeInt(money);dataOutput.writeInt(vip);}public void readFields(DataInput dataInput) throws IOException{this.id = dataInput.readUTF();this.money = dataInput.readInt();this.vip = dataInput.readInt();}@Overridepublic String toString() {return this.id + "\t" + this.money + "\t" + this.vip;}
}

3. Mapper类

  • ConsumerMapper.java
package com.michael.mapreduce;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;public class ConsumerMapper extends Mapper<LongWritable, Text, Text, IntWritable>{@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{String line = value.toString();String[] fields = line.split("\t");String id = fields[0];int money = Integer.parseInt(fields[2]);String vip = fields[3];context.write(new Text(vip), new IntWritable(money));}
}

4. Reducer类

  • ConsumerReducer.java
package com.michael.mapreduce;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class ConsumerReducer extends Reducer<Text, IntWritable, Text, LongWritable>{@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{int count = 0;long sum = 0;for(IntWritable v : values) {count++;sum += v.get();}long avg = sum/count;context.write(key, new LongWritable(avg));}
}

5. Driver类

  • ConsumerDriver.java
package com.michael.mapreduce;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class ConsumerDriver {public static void main(String[] args) throws Exception{Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(ConsumerDriver.class);job.setMapperClass(ConsumerMapper.class);job.setReducerClass(ConsumerReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);FileInputFormat.setInputPaths(job,  new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);}
}

6. 运行

  • 复制数据到 hdfs
[dnn@master Desktop]$ hadoop dfs -copyFromLocal /home/dnn/eclipse-workspace/HDFS_example/consumer.txt /InputDataTest
  • 导出 jar 在 bash 命令行运行
hadoop jar /home/dnn/eclipse-workspace/HDFS_example/consumer_avg.jar com.michael.mapreduce.ConsumerDriver /InputDataTest/consumer.txt /OutputTest2
  • 运行结果
[dnn@master Desktop]$ hadoop fs -cat /OutputTest2/part-r-00000
会员	252
非会员	251

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux共享数据,使用Linux共享数据对象

Linux共享数据对象类似于windows中的动态链接库&#xff0c;其后缀通常为so.* (*为版本号)&#xff0c;例如为我们所熟知的libpcap&#xff0c;它对应的文件为/usr/lib/libpcap.so。如果程序中使用了某共享数据对象文件&#xff0c;需要在链接时指定gcc的链接参数。如使用libpc…

pythonselenium提高爬虫效率_[编程经验] Python中使用selenium进行动态爬虫

Hello&#xff0c;大家好&#xff01;停更了这么久&#xff0c;中间发生了很多事情&#xff0c;我的心情也发生了很大的变化&#xff0c;看着每天在增长的粉丝&#xff0c;实在不想就这么放弃了&#xff0c;所以以后我会尽量保持在一周一篇的进度&#xff0c;与大家分享我的学习…

超级签名源码_企业签名和超级签名有哪些区别?

我们知道iOS系统对于非App Store中的应用是有安装限制的&#xff0c;而App Store严格的审核机制又将许多APP拒之门外&#xff0c;这令不少开发者们郁闷不已。所以很多开发者们会选择苹果签名的方式&#xff0c;让自己的iOS APP可以不经过App Store就安装在用户的苹果手机上&…

2015-01-14

1.鞋子到了 2.网络一天没有好 3. 又吸烟了,难受 4. 单双杠&#xff1a;60 5. 洗澡&#xff1a;no 6. 仰卧起坐&#xff1a;100 7. 洗脚/刷牙 8.曾的车 9.老梁关世界 总结&#xff1a;今天还好吧&#xff0c;但我还是很想znn&#xff01;&#xff01; 转载于:https://www.cnblo…

天池 在线编程 到达终点

文章目录1. 题目2. 解题1. 题目 描述 A robot is located in a pair of integer coordinates (x, y). It must be moved to a location with another set of coordinates. Though the bot can move any number of times, it can only make the following two types of moves:…

python os函数_python os模块主要函数

使用python提供的os模块&#xff0c;对文件和目录进行操作&#xff0c;重命名文件&#xff0c;添加&#xff0c;删除&#xff0c;复制目录以及文件等。一、文件目录常用函数在进行文件和目录操作时&#xff0c;一般会用到以下几种操作。1、获得当前&#xff1b;路径在python中可…

第十七节(is-a 、is-like-a 、has-a,包和 import )

is - a 类与类之间的继承关系&#xff1b;is - like - a 类与接口之间的关系&#xff1b;has - a 关联关系&#xff1b; public class Animal{public void method01();}// 类与类之间的关系class Dog extends Animal{ // Dog is a Animal} /// public interface I{public void…

quartz获取开始结束时间_Springboot集成quartz

Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。本文描述在springboot 2.x环境下怎么集成quartz。一、添加quartz到项目中在pom.xml中加入 <dependency>特别注意application入口类的注解&#xff0c;这里一定…

linux 添加本地磁盘,XenServer如何添加本地存储

在一次测试中&#xff0c;发现本地有两块磁盘&#xff0c;但是只有一块磁盘在XenServer中显示出来&#xff0c;另外一块没有显示。本地只有一个Local storage。查询KB后&#xff0c;发现XenServer可以添加多块本地存储。详情&#xff0c;请见KB&#xff1a;CTX121313详细添加如…

流畅的Python 5. 函数

文章目录1. 函数对象2. 高阶函数3. 匿名函数4. 可调用函数5. 定位参数、仅限关键字参数6. 获取参数信息7. 函数注解8. 支持函数式编程的包1. 函数对象 def factorial(n):returns n! n的阶乘return 1 if n < 2 else n * factorial(n - 1)print(factorial(42)) print(factori…

python方向键键值_python字典键值对的添加和遍历方法

添加键值对 首先定义一个空字典 >>> dic{} 直接对字典中不存在的key进行赋值来添加 >>> dic[name]zhangsan >>> dic {name: zhangsan} 如果key或value都是变量也可以用这种方法 >>> keyage >>> value30 >>> dic[key]val…

无穷大正整数 python_python模块:数字处理

http://blog.csdn.net/pipisorry/article/details/37055183python数字处理简介数字类型python没有unsighed int&#xff1a;The Python int is an abstraction of an integer value, not a direct access to a fixed-byte-size integer.不过int还是当成sighed int处理的&#x…

linux主机基本情况,查看linux主机系统基本信息.pdf

查看linux 主机系统的基本信息一、 硬件信息1. CPUa. Cat /proc/cpuinfo例&#xff1a;[rootlinux victor]# cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 13model name : Intel(R) Celeron(R) M processor 1.50GHzstepping : 8cpu MHz : 150…

LeetCode 1805. 字符串中不同整数的数目(哈希set)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 word &#xff0c;该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。 例如&#xff0c;“a123bc34d8ef34” 将会变成 " 123 34 8 34" 。 注意&#xff0c;剩下的这些整数间至少要用一个空格隔…

Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper

异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成&#xff0c;Message、Handler、MessageQueue和Looper。 1、Message Message是在线程之间传递的消息&#xff0c;它可以在内部携带少量的信息&#xff0c;用于在不同线程之间交换数据。上个例子中就使用了Messa…

linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...

tree命令&#xff0c;主要功能是创建文件列表&#xff0c;将所有文件以树的形式列出来linux下的tree就比较强大了&#xff0c;但一般系统并不自带这个命令&#xff0c;需要手动下载安装,安装sudo apt install tree## or using yum# yum -y install tree语法tree[-aACdDfFgilnNp…

映射表map(平衡二叉树实现)_手动实现Java集合容器之TreeMap(上)

上一篇我们手写了HashMap&#xff0c;还有一个很重要的Map的实现类TreeMap。打开源码第一句话&#xff1a;* A Red-Black tree based {link NavigableMap} implementation.TreeMap是一个基于红黑树的实现。对红黑树没有了解怎么办&#xff0c;那就先搞清楚红黑树的原理。只要理…

wltc循环多少公里_原来所有车都烧机油!但是烧多少才算正常你知道吗?

点击上方“腾讯汽车”关注我们&#xff0c;最新汽车资讯&#xff0c;最方便的用车常识还有最萌的小编都在这里啦&#xff01;最为当今汽车用户最为关心的问题&#xff0c;烧机油现象被很多用户当做引擎是好是坏的重要标准。但根据机油在引擎内冷却及清理引擎内杂质的循环机制来…

LeetCode 1806. 还原排列的最少操作步数(模拟)

文章目录1. 题目2. 解题1. 题目 给你一个偶数 n​​​​​​ &#xff0c;已知存在一个长度为 n 的排列 perm &#xff0c;其中 perm[i] i​&#xff08;下标 从 0 开始 计数&#xff09;。 一步操作中&#xff0c;你将创建一个新数组 arr &#xff0c;对于每个 i &#xff…

linux 间隔定时器,Linux间隔定时器的使用 探索一

2011年1月17日之前看《高级Unix编程》说有基本定时器与高级定时器之分好像基本定时器不符合我的要求&#xff0c;那么就先来个高级的吧。写个代码看看会有什么发生&#xff1a;2011年1月18日看下timer_create函数intt1;timer_t tm_id;//timer_t其实是个long型t1 timer_create(…