使用MapReduce计算每年的销售量和销售额

1.Map端

package Task7.productsSales;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 
// k2  v2  
public class ProductsMapper extends Mapper<LongWritable, Text, Text, Products> { 
@Override 
protected void map(LongWritable key1, Text value1, Context context) 
throws IOException, InterruptedException { 
//存储数据
String data = value1.toString(); 
//分词 
String[] words = data.split(","); 
//创建商品对象 
Products p = new Products(); 

//日期---将日期只保留年份,即words数组的第三位
String date = words[2];
Date d = null;
try {
    d = new SimpleDateFormat("yyyy-mm-dd").parse(date);
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
SimpleDateFormat Syear = new SimpleDateFormat("yyyy");
String year = Syear.format(d);
p.setPdate(year);

//销售数量
p.setPnum(Integer.parseInt(words[5])); 

//销售总额
p.setPtotal(Double.valueOf(words[6])); 

//输出:k2 年份 v2 销售笔数 
context.write(new Text(p.getPdate()), p); 
} 
}

2.Reduce端

package Task7.productsSales;

import java.io.IOException;
import java.text.DecimalFormat;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; 
public class ProductsReducer extends Reducer<Text, Products, Text, Text> { 
protected void reduce(Text k3, Iterable<Products> v3,Context context) throws IOException, InterruptedException {
/* 
* k3  v3 
*/ 
    int total_number = 0;
    double total_money = 0;
    
for(Products p:v3){ 
//总销量
total_number = total_number+p.getPnum();
//总金额
total_money = total_money+p.getPtotal();
} 
DecimalFormat df = new DecimalFormat("#.00");
String show = "销售量为:" + Integer.toString(total_number) + "---------" + "销售总金额为: " + df.format(total_money);
context.write(k3, new Text(show)); 
} 
}

3.Main主类

package Task7.productsSales;

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 ProductsMain { 
public static void main(String[] args) throws Exception { 
//创建一个job 
Job job = Job.getInstance(new Configuration()); 
job.setJarByClass(ProductsMain.class); 
//指定job的mapper和输出的类型 k2 v2 
job.setMapperClass(ProductsMapper.class); 
job.setMapOutputKeyClass(Text.class); //年份
job.setMapOutputValueClass(Products.class); //销售量

//指定job的reducer和输出的类型 k4 v4 
job.setReducerClass(ProductsReducer.class); 
job.setOutputKeyClass(Text.class); //年份
job.setOutputValueClass(Text.class); //销售量

//指定job的输入和输出的路径 
FileInputFormat.setInputPaths(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 

//执行任务 
job.waitForCompletion(true); 
} 
}

4.Product序列化

package Task7.productsSales;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.Writable;

//数据: 7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30 
public class Products implements Writable {
    private int pno;
    private int bno;
    private String pdate;
    private int pmethod;
    private int psales;
    private int pnum;
    private Double ptotal;

    public void readFields(DataInput input) throws IOException {
        // 反序列化
        this.pno = input.readInt();
        this.bno = input.readInt();
        this.pdate = input.readUTF();
        this.pmethod = input.readInt();
        this.psales = input.readInt();
        this.pnum = input.readInt();
        this.ptotal = input.readDouble();
    }

    public void write(DataOutput output) throws IOException {
        // 序列化
        output.writeInt(this.pno);
        output.writeInt(this.bno);
        output.writeUTF(this.pdate);
        output.writeInt(this.pmethod);
        output.writeInt(this.psales);
        output.writeInt(this.pnum);
        output.writeDouble(this.ptotal);
    }

    public int getPno() {
        return pno;
    }

    public void setPno(int pno) {
        this.pno = pno;
    }

    public int getBno() {
        return bno;
    }

    public void setBno(int bno) {
        this.bno = bno;
    }

    public String getPdate() {
        return pdate;
    }

    public void setPdate(String pdate) {
        this.pdate = pdate;
    }

    public int getPmethod() {
        return pmethod;
    }

    public void setPmethod(int pmethod) {
        this.pmethod = pmethod;
    }
    
    public int getPsales() {
        return psales;
    }

    public void setPsales(int psales) {
        this.psales = psales;
    }


    public int getPnum() {
        return pnum;
    }

    public void setPnum(int pnum) {
        this.pnum = pnum;
    }
    
    public Double getPtotal() {
        return ptotal;
    }

    public void setPtotal(Double potal) {
        this.ptotal = potal;
    }

}

5.在Linux终端,使用命令将要统计的txt文件上传到HDFS中

hdfs dfs -put   linux下的文件路径  要上传到hdfs中的路径

6.在Linux终端输入进入上述java代码所在路径,打包成jar包

mvn clean package

7.接着使用命令:cd target 进入target目录
8.运行程序

hadoop  jar ...具体命令忘记了。。。书上有,看书
注意此处运行后存放结果的那个文件,必须是不存在的,不能事先创建好

9.得到并查看结果

hdfs dfs -cat ...填写你自己设置的显示文件的地址
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352