19 使用MapReduce编程统计超市1月商品被购买的次数

首先将1月份的订单数据上传到HDFS上,订单数据格式 ID Goods两个数据字段构成

将订单数据保存在order.txt中,(上传前记得启动集群)。

打开Idea创建项目

修改pom.xml,添加依赖

复制代码
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
    </dependency>
</dependencies>

指定打包方式:jar

打包时插件的配置:

复制代码
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

在resources目录下新建log4j文件log4j.properties

复制代码
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=D:\\ordercount.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

在com.maidu.ordercount包中创建一个新类ShoppingOrderCount类,编写以下模块

1.Mapper模块的编写

在ShoppingOrderCount中定义一个内部类MyMapper

复制代码
public static class MyMap extends Mapper<Object,Text, Text, IntWritable>{

    @Override
    public void map(Object key,Text value,Context context) throws IOException ,InterruptedException {
        String line =value.toString();
        String[] arr =line.split(" "); //3 水果    水果作为键    值 1(数量1 不是 3 表示用户编号)
        if(arr.length==2){
            context.write( new Text(arr[1]),new IntWritable(1)  );
        }
    }
}

2.Reducer模块的编写

在ShoppingOrderCount中定义一个内部类MyReduce

复制代码
public static class MyReduce extends Reducer<Text,IntWritable,Text,IntWritable>{
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
      int count =0;
      for(IntWritable val:values){
          count++;
      }
      context.write(key,new IntWritable(count));

    }
}

3.Driver模块的编写

在ShoppingOrderCount类中编写主方法

复制代码
public static void main(String[] args) throws Exception{
    Configuration conf =new Configuration();
    String []otherArgs =new GenericOptionsParser(conf,args).getRemainingArgs();
    if(otherArgs.length<2){
        System.out.println("必须输入读取文件路径和输出文件路径");
        System.exit(2);
    }

    Job job = Job.getInstance(conf,"order count");
    job.setJarByClass(ShoppingOrderCount.class);
    job.setMapperClass(MyMap.class);
    job.setReducerClass(MyReduce.class);
    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
    //添加输入的路径
    for(int i =0;i<otherArgs.length-1;i++){
        FileInputFormat.addInputPath(job,new Path(otherArgs[i]));
    }
    //设置输出路径
    FileOutputFormat.setOutputPath(job,new Path(otherArgs[otherArgs.length-1]));
    //执行任务
    System.exit( job.waitForCompletion(true)?0:1 );

}

4.使用Maven编译打包,将项目打包为jar

从上往下,四步走,最终target下会生产jar文件

5.将orderCount-1.0-SNAPSHOT.jar拷贝上传到master主机上。

6.执行Jar

yt@master \~\]$ hadoop jar orderCount-1.0-SNAPSHOT.jar com.maidu.ordercount.ShoppingOrderCount /bigdata/order.txt /output-2301-02/ ![](https://file.jishuzhan.net/article/1785258201738907649/2fb91cf357cad3501bb6e7b06c5f2640.webp) 7.执行后查看结果 ![](https://file.jishuzhan.net/article/1785258201738907649/f1c9eea5e47427914746eb2de910aa5d.webp) 备注:如果运行出现虚拟内存不够,请参考:[is running 261401088B beyond the 'VIRTUAL' memory limit. Current usage: 171.0 MB of 1 GB physical-CSDN博客](https://blog.csdn.net/lydia88/article/details/137425083 "is running 261401088B beyond the ‘VIRTUAL‘ memory limit. Current usage: 171.0 MB of 1 GB physical-CSDN博客")

相关推荐
T06205144 小时前
工具变量-5G试点城市DID数据(2014-2025年
大数据
向往鹰的翱翔4 小时前
BKY莱德因:5大黑科技逆转时光
大数据·人工智能·科技·生活·健康医疗
鸿乃江边鸟5 小时前
向量化和列式存储
大数据·sql·向量化
IT毕设梦工厂6 小时前
大数据毕业设计选题推荐-基于大数据的客户购物订单数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata
java水泥工6 小时前
基于Echarts+HTML5可视化数据大屏展示-白茶大数据溯源平台V2
大数据·echarts·html5
广州腾科助你拿下华为认证8 小时前
华为考试:HCIE数通考试难度分析
大数据·华为
在未来等你10 小时前
Elasticsearch面试精讲 Day 17:查询性能调优实践
大数据·分布式·elasticsearch·搜索引擎·面试
大数据CLUB13 小时前
基于spark的澳洲光伏发电站选址预测
大数据·hadoop·分布式·数据分析·spark·数据开发
ratbag67201314 小时前
当环保遇上大数据:生态环境大数据技术专业的课程侧重哪些领域?
大数据
计算机编程小央姐15 小时前
跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
大数据·hadoop·信息可视化·spark·django·课程设计·食物