Hadoop MapReduce 统计汽车销售信息

这篇具有很好参考价值的文章主要介绍了Hadoop MapReduce 统计汽车销售信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本文将讨论如何使用Hadoop MapReduce来统计汽车销售信息。

汽车销售数据文件

汽车销售的记录文件名叫Cars.csv,里面记录了汽车的销售信息,数据内容如下:

山西省,3,朔州市,朔城区,2013,LZW6450PF,上汽通用五菱汽车股份有限公司,五菱,小型普通客车,个人,非营运,1,L3C,8424,79,汽油,4490,1615,1900,,,,2,3050,1386,175/70R14LT,4,2110,1275,,7,,,,,客车,1913,男性
山西省,3,晋城市,城区,2013,EQ6450PF1,东风小康汽车有限公司,东风,小型普通客车,个人,非营运,1,DK13-06,1587,74,汽油,4500,1680,1960,,,,2,3050,1435,185R14LT 6PR,4,1970,1290,,7,,东风小康汽车有限公司,,EQ6440KMF,客车,1929,男性
山西省,12,长治市,长治城区,2013,BJ6440BKV1A,北汽银翔汽车有限公司,北京,小型普通客车,个人,非营运,1,BJ415A,1500,75,,4440,,,,,,,,,,,,,,,,北汽银翔汽车有限公司,北京,BJ6440BKV1A,,1938,男性
山西省,12,长治市,长治城区,2013,DXK6440AF2F,东风小康汽车有限公司,东风,小型普通客车,个人,非营运,1,DK15,1499,85,汽油,4365,1720,1770,,,,2,2725,1425,185/65R14,4,1835,1235,,5,,东风小康汽车有限公司,东风,DXK6440AF2F,多用途乘用车,1926,女性
...

格式为:
第1列:销售的省份
第3列:销售的城市
第7列:汽车生产商
第8列:汽车品牌名
第12列:汽车销售数量

已经将Cars.csv上传到HDFS文件系统的/input目录下。

汽车销售数据统计分析项目hadoop,实战案例,hadoop,mapreduce,汽车

统计各城市销售汽车的数量

思路

要统计城市销售汽车的数量,由于只涉及到了城市、数量,所以可以可以采取用城市作为Key,用销售数量作为Value,当成Map的输出,再由Reduce对Map的结果按照城市将销售数据进行汇总即可。

代码

package com.wux.labs.hadoop.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class CarSalesCount1 {
    public static class CarSalesCountMapper
            extends Mapper<Object, Text, Text, IntWritable> {

        private Text city = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            // CSV文件,所以这里用逗号分割列
            String values[] = value.toString().split(",");
            // 第3列是城市,这里以城市作为Key
            city.set(values[2]);
            // 第12列是销售数量,直接取销售数量,而不是取1
            context.write(city, new IntWritable(Integer.parseInt(values[11])));
        }
    }

    public static class CarSalesCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            // 对销售数量累加
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            // 根据城市得到累加的结果
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "SalesCount1");
        job.setJarByClass(CarSalesCount1.class);
        job.setMapperClass(CarSalesCountMapper.class);
        job.setReducerClass(CarSalesCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path("/input/Cars.csv"));
        FileOutputFormat.setOutputPath(job, new Path("/output"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

打包后直接运行:

hadoop jar Hadoop-1.0-SNAPSHOT.jar com.wux.labs.hadoop.mr.CarSalesCount1

运行完成后可查看结果:

汽车销售数据统计分析项目hadoop,实战案例,hadoop,mapreduce,汽车

统计各城市销售品牌的数量

思路

与销售数量不同,销售数量的话直接将销售记录中的数量相加就可以了,但是销售品牌数,则只统计到汽车品牌的数量,不管一个品牌销售了多少辆汽车,都只算一个品牌,因此,不能按销售数量累加统计。

方案1

在Map阶段,可以按:城市 + 品牌 作为输出的Key,Value任意,在Map之后增加Combiner阶段,因为Map阶段的Key可以保证输出的记录中相同城市的不同记录中品牌都是不重复的,所以Combiner阶段可以按城市作为Key,1作为Value输出,最后由Reduce阶段按城市Key,对Combiner的Value进行汇总即可。

方案1代码

package com.wux.labs.hadoop.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class CarSalesCount2 {
    public static class CarSalesCountMapper
            extends Mapper<Object, Text, Text, IntWritable> {

        private Text city = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            // CSV文件,所以这里用逗号分割列
            String values[] = value.toString().split(",");
            // 第3列是城市,第8列是品牌,这里以城市+品牌作为Key
            city.set(values[2] + " " + values[7]);
            // Map阶段的Value不会使用,所以Value可以任意
            context.write(city, new IntWritable(1));
        }
    }

    public static class CarSalesCountCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            Text cs = new Text();
            // Combiner阶段按照Map阶段的Key进行拆分,城市作为Key
            cs.set(key.toString().split(" ")[0]);
            // 因为每行记录中同一个城市的品牌不会重复,所以Value取1
            context.write(cs, new IntWritable(1));
        }
    }


    public static class CarSalesCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            // 对品牌数量累加
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            // 根据城市得到累加的结果
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "SalesCount");
        job.setJarByClass(CarSalesCount2.class);
        job.setMapperClass(CarSalesCountMapper.class);
        job.setCombinerClass(CarSalesCountCombiner.class);
        job.setReducerClass(CarSalesCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path("/input/Cars.csv"));
        FileOutputFormat.setOutputPath(job, new Path("/output"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

打包后直接运行:

hadoop jar Hadoop-1.0-SNAPSHOT.jar com.wux.labs.hadoop.mr.CarSalesCount2

运行完成后可查看结果:

汽车销售数据统计分析项目hadoop,实战案例,hadoop,mapreduce,汽车

方案2

除了可以重组Key,增加Combiner阶段来进行计数,还可以直接在Map阶段用城市作为Key,用品牌作为Value进行输出,Map阶段后不需要Combiner阶段直接到Reduce阶段,Reduce阶段由于接收到的Map的输出不是数字,而是汽车品牌,是字符串,所以可以用Set进行数据保存,最后统计Set中元素的个数即可。

方案2代码

package com.wux.labs.hadoop.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

public class CarSalesCount3 {
    public static class CarSalesCountMapper
            extends Mapper<Object, Text, Text, Text> {

        private Text city = new Text();
        private Text brand = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            // CSV文件,所以这里用逗号分割列
            String values[] = value.toString().split(",");
            // 第3列是城市,这里以城市作为Key
            city.set(values[2]);
            // 第8列是品牌,直接取品牌作为Value
            brand.set(values[7]);
            context.write(city, brand);
        }
    }

    public static class CarSalesCountReducer extends Reducer<Text, Text, Text, IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            Set set = new HashSet();
            // 将销售品牌放入Set集合
            for (Text val : values) {
                String brand = val.toString();
                if (!set.contains(brand)) {
                    set.add(brand);
                }
            }
            result.set(set.size());
            // 根据城市得到累加的结果
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        System.setProperty("HADOOP_USER_NAME", "hadoop");
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "SalesCount1");
        job.setJarByClass(CarSalesCount3.class);
        job.setMapperClass(CarSalesCountMapper.class);
        job.setReducerClass(CarSalesCountReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);
        FileInputFormat.addInputPath(job, new Path("/input/Cars.csv"));
        FileOutputFormat.setOutputPath(job, new Path("/output"));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

打包后直接运行:

hadoop jar Hadoop-1.0-SNAPSHOT.jar com.wux.labs.hadoop.mr.CarSalesCount3

运行完成后可查看结果:

汽车销售数据统计分析项目hadoop,实战案例,hadoop,mapreduce,汽车文章来源地址https://www.toymoban.com/news/detail-775881.html

到了这里,关于Hadoop MapReduce 统计汽车销售信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nodejs+vue+elementui汽车销售网站

    前端技术:nodejs+vue+elementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进行交互,从而使得用户在点击网页进行操作时能够正常。 可以设置中间件来响应 HTTP 请求。  Express 框架于Node运行环境的Web框架, 。本靓车汽车

    2024年02月16日
    浏览(33)
  • 数据库--汽车销售管理系统【课程设计】

    目录 1.设计任务 1.1系统开发的背景  1.2系统开发的意义  1.3系统所应用的模块 2.需求分析 2.1功能分析 2.2数据流图 2.3数据字典 3.概念结构设计 4.逻辑结构设计 5.物理结构设计 5.1基本表 5.2视图 6.数据库实施 6.1 建立数据库表 6.2建立视图 7.数据库操作 目录 1.1系统开发的背景 

    2023年04月08日
    浏览(38)
  • Hive数据分析案例——汽车销售数据分析

    使用HiveQL实现来实现,本数据为上牌汽车的销售数据,分为乘用车辆和商用车辆。数据包含销售相关数据与汽车具体参数。数据项包括:时间、销售地点、邮政编码、车辆类型、车辆型号、制造厂商名称、排量、油耗、功率、发动机型号、燃料种类、车外廓长宽高、轴距、前

    2024年02月09日
    浏览(86)
  • 44基于java的汽车销售管理系统设计与实现

    本章节给大家带来一个基于java的汽车销售管理系统设计与实现,车辆4S店管理系统,基于java汽车销售交易网站,针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理。 实现一个汽车销售管理系统,汽车销售

    2024年02月08日
    浏览(87)
  • 基于springboot+html的汽车销售管理系统设计与实现

    🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 前言 随着汽车市场的快速发展,汽车销售企业面临着越来越大的管理压力。为了提高销售效率和客户满意度,开发一个基于Java的汽车销售管理系统变得尤为重要。本系统旨在提供一

    2024年01月21日
    浏览(40)
  • 基于 Python 的新能源汽车销售数据可视化系统设计与实现

    在之前提及的登录操作无误后,我们就可以进入网站中去操作网站的对应的功能,而且我们在使用任何功能的适合都会留下脚印,以便管理员可以实时查看用户的操作情况,在执行操作性功能的时候都将产生相应的信息,这对于我们的数据完整性有着很重要的核对作用。流程

    2024年01月23日
    浏览(51)
  • 基于JAVA的汽车零件销售系统的设计与实现 毕业设计开题报告

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月04日
    浏览(27)
  • Java精品项目源码第155期汽车在线销售管理系统(编号S063)

    大家好,小辰今天给大家介绍一个基于Spring + Springboot+ MyBatis实现的汽车在线销售管理系统,演示视频文章末尾公众号对号查询观看即可 难度指数(中高等) 提示:小伙伴有问题记得下方评论留言啦,本项目难度中等。 一、项目运行 1.运行环境 环境配置: Jdk1.8 + Tomcat8.5 +

    2024年02月14日
    浏览(36)
  • 基于Java汽车配件销售业绩管理系统设计实现(源码+lw+部署文档+讲解等)

    博主介绍 : ✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 Java项目精品

    2024年02月08日
    浏览(44)
  • springboot+java汽车配件销售业绩管理系统 J2EE平台技术

    汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时,如何更好地管理企业现有销售项目资源成为摆在该类企业面前的重要课题之一。本次打算开发的springboot汽车配件销售业绩管理系统的开发过程引用 J2EE平台技术,该平台中所包含的JDBC、JNDI等组件,规定访问数据

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包