说一下需求,有一张销售统计表,记录每个销售员每天的销售情况,现在要统计出某一月的每个销售员的销售情况并且按照销售额从高往低排序(hadoop默认是升序)。
首先在mysql里创建一张表
CREATE TABLE `t_product_sales` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`area` varchar(255) DEFAULT NULL COMMENT '地区',
`salesman` varchar(255) DEFAULT NULL COMMENT '销售员姓名',
`sales_money` decimal(10,0) DEFAULT NULL COMMENT '销售额',
`sale_time` varchar(255) DEFAULT NULL COMMENT '销售日期(年-月-日)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11717 DEFAULT CHARSET=utf8 COMMENT='销售统计表';
然后使用excl造数据,为了节约时间,这里制造了5月份的所有数据表数据
下面是在mysql里需求的sql语句
SELECT salesman,sum(sales_money) totalmoney
FROM `t_product_sales`
WHERE sale_time like '2015-05%'
GROUP BY salesman
ORDER BY totalmoney DESC;
将数据从mysql中导出,并且导出成文本,文本数据,将导出的文本上传到hdfs中,放在根据经下的groupcount-in文件夹下。
我们先来分析下数据,在文本里每一行代表一个记录,在一行中以制表符区分字段。我们首先要取出所有五月份的数据,然后再对每一天的数据进行操作,取出每个人的销售额,最后排序。那么具体到程序上,map的任务就是取出五月份的的数据,reduce就是进行统计。好了,下面开始编写。
在Eclipse创建项目,编写一个GroupCount类,下面是类代码:
GroupCount.java此类将数据提取出来,然后按销售员分组输出
package gruopcount;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apach