当前位置: 首页 > news >正文

hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序

一、原始消费数据buy.txt

zhangsan 5676 2765 887
lisi 6754 3234 1232
wangwu 3214 6654 388
lisi 1123 4534 2121
zhangsan 982 3421 5566
zhangsan 1219 36 45

二、实现思路:先通过一个MapReduce将顾客的消费金额进行汇总,再通过一个MapReduce来根据金额进行排序
三、定义一个实体类(其中compareTo方法实现了排序规则):

package cn.edu.tju;import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;public class Buy implements WritableComparable<Buy> {private double jingdong;private double taobao;private double duodian;public Buy() {}public Buy(double jingdong, double taobao, double duodian) {this.jingdong = jingdong;this.taobao = taobao;this.duodian = duodian;}public double getJingdong() {return jingdong;}public void setJingdong(double jingdong) {this.jingdong = jingdong;}public double getTaobao() {return taobao;}public void setTaobao(double taobao) {this.taobao = taobao;}public double getDuodian() {return duodian;}public void setDuodian(double duodian) {this.duodian = duodian;}@Overridepublic String toString() {return "" +"" + jingdong +"\t" + taobao +"\t" + duodian;}@Overridepublic void write(DataOutput out) throws IOException {out.writeDouble(jingdong);out.writeDouble(taobao);out.writeDouble(duodian);}@Overridepublic void readFields(DataInput in) throws IOException {this.jingdong =in.readDouble();this.taobao = in.readDouble();this.duodian = in.readDouble();}@Overridepublic int compareTo(Buy o) {if(this.jingdong>o.getJingdong()){return 1;} else if(this.getJingdong()< o.getJingdong()){return -1;} else {if(this.getTaobao()>o.getTaobao()){return 1;}else if(this.getTaobao()< o.getTaobao()){return -1;} else return 0;}}
}

四、定义第一对Mapper和Reducer

package cn.edu.tju;import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class MyBuyMapper1 extends Mapper<LongWritable, Text, Text, Buy> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String str = value.toString();String[] fieldList = str.split(" ");double jingdong = Double.parseDouble(fieldList[1]);double taobao = Double.parseDouble(fieldList[2]);double duodian = Double.parseDouble(fieldList[3]);String person = fieldList[0];context.write(new Text(person), new Buy(jingdong,taobao,duodian));}
}
package cn.edu.tju;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.Iterator;public class MyBuyReducer1 extends Reducer<Text, Buy, Text, Buy> {@Overrideprotected void reduce(Text key, Iterable<Buy> values, Reducer<Text, Buy, Text, Buy>.Context context) throws IOException, InterruptedException {double sum1 = 0;double sum2 = 0;double sum3 = 0;Iterator<Buy> iterator = values.iterator();while (iterator.hasNext()) {Buy next = iterator.next();sum1 += next.getJingdong();sum2 += next.getTaobao();sum3 += next.getDuodian();}context.write(key, new Buy(sum1, sum2, sum3));}
}

五、定义第二对Mapper和Reducer

package cn.edu.tju;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class MyBuyMapper2 extends Mapper<LongWritable, Text, Buy, Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String str = value.toString();String[] fieldList = str.split("\t");double jingdong = Double.parseDouble(fieldList[1]);double taobao = Double.parseDouble(fieldList[2]);double duodian = Double.parseDouble(fieldList[3]);String person = fieldList[0];context.write(new Buy(jingdong,taobao,duodian), new Text(person));}
}
package cn.edu.tju;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.Iterator;public class MyBuyReducer2 extends Reducer<Buy, Text, Text, Buy> {@Overrideprotected void reduce(Buy key, Iterable<Text> values, Context context) throws IOException, InterruptedException {Iterator<Text> iterator = values.iterator();while(iterator.hasNext()){Text next = iterator.next();context.write(next, key);}}
}

六、定义主类,其中定义两个Job,等第一个job运行结束之后第二Job开始运行

package cn.edu.tju;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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 MyBuyMain2 {public static void main(String[] args) throws Exception {Configuration configuration = new Configuration(true);configuration.set("mapreduce.framework.name", "local");Job job = Job.getInstance(configuration);//job.setJarByClass(MyBuyMain.class);//job namejob.setJobName("buy-" + System.currentTimeMillis());//设置Reducer数量//job.setNumReduceTasks(3);//输入数据路径FileInputFormat.setInputPaths(job, new Path("D:\\tool\\TestHadoop3\\buy.txt"));//输出数据路径,当前必须不存在FileOutputFormat.setOutputPath(job, new Path("count_1" ));job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Buy.class);job.setMapperClass(MyBuyMapper1.class);job.setReducerClass(MyBuyReducer1.class);//等待任务执行完成job.waitForCompletion(true);Job job2 = Job.getInstance(configuration);job2.setJarByClass(MyBuyMain2.class);job2.setJobName("buy2-" + System.currentTimeMillis());FileInputFormat.setInputPaths(job2, new Path("D:\\tool\\TestHadoop3\\count_1\\part-r-00000"));//输出数据路径,当前必须不存在FileOutputFormat.setOutputPath(job2, new Path("count_2" ));job2.setMapOutputKeyClass(Buy.class);job2.setMapOutputValueClass(Text.class);job2.setMapperClass(MyBuyMapper2.class);job2.setReducerClass(MyBuyReducer2.class);//等待任务执行完成job2.waitForCompletion(true);}
}

七、运行结果:

在这里插入图片描述

相关文章:

hadoop:案例:将顾客在京东、淘宝、多点三家平台的消费金额汇总,然后先按京东消费额排序,再按淘宝消费额排序

一、原始消费数据buy.txt zhangsan 5676 2765 887 lisi 6754 3234 1232 wangwu 3214 6654 388 lisi 1123 4534 2121 zhangsan 982 3421 5566 zhangsan 1219 36 45二、实现思路&#xff1a;先通过一个MapReduce将顾客的消费金额进行汇总&#xff0c;再通过一个MapReduce来根据金…...

2024年华为OD机试真题-孙悟空吃蟠桃-Python-OD统一考试(C卷)

题目描述: 孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有N颗桃树,每颗树上都有桃子,守卫将在H小时后回来。 孙悟空可以决定他吃蟠桃的速度K(个/小时),每个小时选一颗桃树,并从树上吃掉K个,如果树上的桃子少于K个,则全部吃掉,并且这一小时剩余的时间…...

vue3 开发中遇到的问题

1. element-plus的el-popover内置el-select组件&#xff0c;如何避免关闭el-popover 在el-select内置上面添加:teleported"false"就可以避免在点击el-select时候&#xff0c;把el-popver给关闭了 2. validate-on-rule-change&#xff1a;是否在 rules 属性改变后…...

Vue input密码输入框自定义密码眼睛icon

我们用的饿了么UI组件库里,密码输入框的icon是固定不变的,如下所示: 点击"眼睛"这个icon不变,现在需求是UI给的设计稿里,密码输入框的"眼睛"有如下两种: 代码如下: <el-input:key="passwordType"ref="password"...

【LAMMPS学习】八、基本知识的讨论(1.4)多副本模拟

8. 基本知识的讨论 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和…...

SpringBoot整合RabbitMQ-应答模式

一、应答模式 RabbitMQ 中的消息应答模式主要包括两种&#xff1a;自动应答&#xff08;Automatic Acknowledgement&#xff09;和手动应答&#xff08;Manual Acknowledgement&#xff09;。&#xff08;一般交换机发送消息&#xff0c;RabbitMQ只有在接收到消费者的确认后才…...

51单片机入门_江协科技_25~26_OB记录的笔记_蜂鸣器教程

25. 蜂鸣器 25.1. 蜂鸣器介绍 •蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号 •蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器&#xff08;开发板上用的无源蜂鸣器&#xff09; •有源蜂鸣器&#xff1a;内部自带振荡源&a…...

新能源汽车电池包为什么不通用,车主怎么用电才算对?

一提起新能源车&#xff0c;大部分人可能知道电动汽车&#xff0c;实际上新能源车的种类是比较多的&#xff0c;这里边也包括了插电式混动汽车、纯电汽车、燃料电池汽车&#xff0c;其中插电混动里还包括了串联式、并联式、混联式&#xff0c;每种汽车都各有优缺点&#xff0c;…...

[C语言]——柔性数组

目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…...

密码学 总结

群 环 域 群 group G是一个集合&#xff0c;在此集合上定义代数运算*&#xff0c;若满足下列公理&#xff0c;则称G为群。 1.封闭性 a ∈ G , b ∈ G a\in G,b\in G a∈G,b∈G> a ∗ b ∈ G a*b\in G a∗b∈G 2.G中有恒等元素e&#xff0c;使得任何元素与e运算均为元素本…...

尚硅谷html5+css3(1)html相关知识

1.基本标签&#xff1a; <h1>最大的标题字号 <h2>二号标题字号 <p>换行 2.根标签<html> 包括<head>和<body> <html><head><title>title</title><body>body</body></head> </html> 3…...

苍穹外卖11(Apache ECharts前端统计,营业额统计,用户统计,订单统计,销量排名Top10)

目录 一、Apache ECharts【前端】 1. 介绍 2. 入门案例 二、营业额统计 1. 需求分析和设计 1 产品原型 2 业务规则 3 接口设计 2. 代码开发 3. 功能测试 三、用户统计 1. 需求分析和设计 1 产品原型 2 业务规则 3 接口设计 2. 代码开发 3. 功能测试 四、订单统…...

大商创多用户商城系统 多处SQL注入漏洞复现

0x01 产品简介 大商创多用户商城系统是一个功能强大、灵活多变的新零售电商系统服务商。该系统支持平台自营和商家入驻,实现多元化经营模式,能够全面整合供应商、生产商、经销商和消费者等产业链资源,提高产品多样性,加快资金流动速度,并有助于减少不必要的成本输出。 0…...

美团一面4/9

面的时候自我感觉良好&#xff0c;复盘感觉答的一坨。。 0怎么比较两个对象 0Integer 不使用new会自动装箱&#xff0c;返回提前创建的。使用new就创建新对象。 1.Object类有什么方法 java中Object类中有哪些常用方法以及作用_java中object的方法有什么用-CSDN博客 2.hash…...

ubuntu下NTFS分区无法访问挂载-解决办法!

Ubuntu系统下&#xff0c;有的时候发现&#xff0c;挂载的NTFS文件系统硬盘无法访问。点击弹出类似问题&#xff1a; Error mounting /dev/sda1 at /media/root/新加卷: Command-line mount -t "ntfs" -o "uhelperudisks2,nodev,nosuid,uid0,gid0" "/…...

如何在 Ubuntu 14.04 上使用 Rsyslog、Logstash 和 Elasticsearch 实现日志集中管理

Elastic 的一篇文章 介绍 理解组织生成的数百万条日志行可能是一个艰巨的挑战。一方面&#xff0c;这些日志行提供了对应用程序性能、服务器性能指标和安全性的视图。另一方面&#xff0c;日志管理和分析可能非常耗时&#xff0c;这可能会阻碍对这些日益必要的服务的采用。 …...

mapbox 工作问题暂时记录

mapbox 工作问题暂时记录 mapbox样式修改1.2.3.4. mapbox样式修改 1. mapbox直接用class名无法修改样式, 可以添加 :deep 来修改样式 2. map.value.getStyle().layers这行代码可以获取页面中所有图层,可以判断图层id来做相应操作 3. map.value.setLayoutProperty(layer.id…...

Linux、Docker、Brew、Nginx常用命令

Linux、Docker、Brew、Nginx常用命令 Linuxvi编辑器文件操作文件夹操作磁盘操作 DockerBrewNginx参考 Linux vi编辑器 Vi有三种模式。命令模式、输入模式、尾行模式&#xff0c;简单的关系如下&#xff1a; i -- 切换到输入模式&#xff0c;在光标当前位置开始输入文本。&a…...

【Spring实战项目】SpringBoot3整合WebSocket+拦截器实现登录验证!从原理到实战

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…...

第二证券|政策利好不断,工业母机概念爆发,华东数控等涨停

工业母机概念10日盘中大幅走高&#xff0c;截至发稿&#xff0c;恒进感应、宏德股份、华东重机、华东数控等涨停&#xff0c;凯腾精工涨超20%&#xff0c;创世纪涨逾11%&#xff0c;华辰配备、盘古智能涨超9%&#xff0c;博亚精工涨逾8%。 音讯面上&#xff0c;工业和信息化部…...

VeraCrypt实战指南:从取证入门到加密容器构建

1. VeraCrypt初探&#xff1a;数字取证中的"保险箱" 第一次接触VeraCrypt是在去年的网络安全竞赛上。当时有个加密容器文件摆在面前&#xff0c;队友急得直挠头&#xff1a;"这玩意儿怎么打开&#xff1f;"我盯着那个看似普通的文件&#xff0c;突然意识到…...

从零开始:crAPI靶场环境搭建与实战通关指南

1. 环境准备&#xff1a;从零搭建crAPI靶场 第一次接触crAPI靶场时&#xff0c;我花了两小时才搞明白为什么docker-compose总是报错。后来发现是因为Ubuntu系统残留的旧版Docker没卸载干净。建议所有新手都从干净的Ubuntu 20.04 LTS环境开始&#xff0c;这会帮你避开80%的环境问…...

10个Pixelfed实例运营成功案例:去中心化照片分享平台实战经验 [特殊字符]

10个Pixelfed实例运营成功案例&#xff1a;去中心化照片分享平台实战经验 &#x1f680; 【免费下载链接】pixelfed Photo Sharing. For Everyone. 项目地址: https://gitcode.com/GitHub_Trending/pi/pixelfed Pixelfed是一个开源的去中心化照片分享平台&#xff0c;基…...

掌握8个wxappUnpacker实战技巧:小程序解包与代码还原完全指南

掌握8个wxappUnpacker实战技巧&#xff1a;小程序解包与代码还原完全指南 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 为什么90%的小程序开发者都需要解包工具&#xff1f; 在小程序开发过程中&#xff0c;开发者…...

Qwen3-ASR-1.7B部署案例:高校科研组构建本地化学术讲座语音知识库

Qwen3-ASR-1.7B部署案例&#xff1a;高校科研组构建本地化学术讲座语音知识库 1. 项目背景与价值 高校科研团队经常举办各类学术讲座和研讨会&#xff0c;这些宝贵的学术内容通常以音频形式记录。传统的人工转录方式耗时耗力&#xff0c;且对于专业术语密集的学术内容&#x…...

RWKV7-1.5B-g1a作品分享:多轮追问下保持主题聚焦的能力验证

RWKV7-1.5B-g1a作品分享&#xff1a;多轮追问下保持主题聚焦的能力验证 1. 模型简介与测试背景 rwkv7-1.5B-g1a是基于RWKV-7架构的多语言文本生成模型&#xff0c;特别适合基础问答、文案续写、简短总结和轻量中文对话场景。本次测试将重点验证该模型在多轮对话中保持主题聚焦…...

别再乱用@DateTimeFormat和@JsonFormat了!SpringBoot时间处理保姆级避坑指南

SpringBoot时间格式化深度解析&#xff1a;从注解误用到生产级解决方案 凌晨三点&#xff0c;服务器告警铃声划破寂静——某跨境支付系统突然出现大量交易时间戳错误&#xff0c;导致对账差异超过百万美元。团队紧急排查发现&#xff0c;问题根源竟是开发人员混用了JsonFormat…...

离散状态观测器

-伺服&#xff08;实用&#xff09;A川伺服--模型追踪控制&#xff08;末端低频振动抑制-pmsm 完全自己搭建&#xff0c;原理清晰&#xff0c;效果可靠&#xff0c;可实际验证包含: &#xff08;1&#xff09;详细原理性推导 &#xff08;2&#xff09;仿真基于离散化模型以及离…...

避坑指南:ESP32 ADC测量不准?7个常见错误与校准优化方案

ESP32 ADC精度优化实战&#xff1a;从硬件设计到软件校准的完整避坑手册 当你在ESP32项目中使用ADC读取传感器数据时&#xff0c;是否遇到过这些情况&#xff1a;明明输入电压稳定&#xff0c;读数却像心电图一样上下跳动&#xff1f;同一个电路在不同开发板上测出的数值相差甚…...

【仅限前500名工程师】Python智能内存管理高阶训练营核心讲义:17个真实OOM案例、8种定制化GC策略、1份可审计内存SLA模板

第一章&#xff1a;Python智能体内存管理策略最佳实践Python智能体&#xff08;如基于LLM的Agent、ReAct架构或Tool-Calling系统&#xff09;在长期运行中易因对象滞留、缓存膨胀和闭包引用导致内存持续增长。高效内存管理不仅关乎稳定性&#xff0c;更直接影响推理延迟与并发吞…...