Hadoop工程师面试题(1)--MapReduce实现单表汇总统计
数据源格式描述:
输入t1.txt源数据,数据文件分隔符”*&*”,字段说明如下:
| 字段序号 | 字段英文名称 | 字段中文名称 | 字段类型 | 字段长度 |
| 1 | TIME_ID | 时间(到时) | 字符型 | 12 |
| 2 | Session | 会话时长 | 数值型 | 8 |
| 3 | MSISDN | 用户号码 | 字符型 | 11 |
| 4 | SP_DOMAIN | SP域名 | 数值型 | 64 |
| 5 | USER_AGENT_ORIGN | 终端字串 | 字符型 | 128 |
| 6 | USER_AGENT | 终端类别 | 字符型 | 64 |
| 7 | UPSTREAM_VOL | 上行流量 | 数值型 | 8 |
| 8 | DOWNSTREAM_VOL | 下行流量 | 数值型 | 8 |
| 9 | URL_CNT | 访问次数 | 数值型 | 20 |
用mapreduce实现单表汇总:
在数据源的基础上,根据终端类型汇总出总流量及访问次数。汇总模型字段说明如下:
| 字段序号 | 字段英文名称 | 字段中文名称 | 字段类型 | 字段长度 |
| 1 | USER_AGENT | 终端类型 | 字符型 | |
| 2 | TOT_FLUX | 总流量 | 数值型 | 30 |
| 3 | URL_CNT | 访问次数 | 数值型 | 30 |
代码如下:
package mianshi;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;import com.google.protobuf.TextFormat;
public class Test1 {
/**
* @param args
* @throws IOException
* @throws InterruptedException
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws Exception {
//创建配置文件
Configuration conf=new Configuration();
//创建job
Job job = new Job(conf,Test1.class.getName());
//设置jar包运行
job.setJarByClass(Test1.class);
//设置输入路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
//设置输入格式
job.setInputFormatClass(TextInputFormat.class);
//设置自定义Mapper
job.setMapperClass(MyMapper.class);
//设置Map输出的Value类型,也就是V2
job.setMapOutputValueClass(Model.class);
//设置Map输出的Key类型,也就是K2
job.setMapOutputKeyClass(Text.class);
//设置分区类型
job.setPartitionerClass(HashPartitioner.class);
//设置Rudece任务数
job.setNumReduceTasks(1);
//设置自定义Reduce类
job.setReducerClass(MyReducer.class);
//设置输出K3的类型
job.setOutputKeyClass(Text.class);
//设置输出的V3类型
job.setOutputValueClass(Model.class);
//设置输出的格式
job.setOutputFormatClass(TextOutputFormat.class);
//指定输出路径
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//提交job
job.waitForCompletion(true);}
static class MyMapper extends Mapper<LongWritable, Text, Text, Model>{
@Override
protected void map(LongWritable k1, Text v1,Context context)
throws IOException, InterruptedException {
/**
* 切割字符串有点意思!
* “*”是特殊字符,需要用[]
* "&"需要用\\转义
*
*
*/
String[] split = v1.toString().split("[*]\\&[*]");
Text user_agent = new Text(split[5]);
Long tot_flux = new Long(split[6])+new Long(split[7]);
Long url_cnt = new Long(split[8]);
Model v2 = new Model(tot_flux, url_cnt);
context.write(user_agent, v2);
}
}
static class MyReducer extends Reducer<Text, Model, Text, Model>{
@Override
protected void reduce(Text k2, Iterable<Model> v2s,Context context)
throws IOException, InterruptedException {
//定义计数器
long sum_flux =0L;
long sum_url = 0L;
for(Model model : v2s){
sum_flux += model.tot_flux;
sum_url += model.url_cnt;
}
Model v3 = new Model(sum_flux,sum_url);
context.write(k2, v3);
}
}}
/**
* 自定义类型必须实现Writable
* @author Sky
*
*/
class Model implements Writable{
long tot_flux;
long url_cnt;
public Model(){}
public Model(Long tot_flux,Long url_cnt){
this.tot_flux = tot_flux;
this.url_cnt = url_cnt;
}public void write(DataOutput out) throws IOException {
//序列化出去
out.writeLong(tot_flux);
out.writeLong(url_cnt);
}public void readFields(DataInput in) throws IOException {
//和序列化出去的一样
this.tot_flux = in.readLong();
this.url_cnt = in.readLong();
}
//必须覆写toString方法,否则输出的值是内存值
@Override
public String toString() {
return tot_flux+"\t"+url_cnt;
}
}
文章参考论坛:超人hadoop网络学院论坛
Hadoop工程师面试题(1)--MapReduce实现单表汇总统计的更多相关文章
- Hadoop on Mac with IntelliJ IDEA - 8 单表关联NullPointerException
简化陆喜恒. Hadoop实战(第2版)5.4单表关联的代码时遇到空指向异常,经分析是逻辑问题,在此做个记录. 环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.5, Ha ...
- Hadoop案例(七)MapReduce中多表合并
MapReduce中多表合并案例 一.案例需求 订单数据表t_order: id pid amount 1001 01 1 1002 02 2 1003 03 3 订单数据order.txt 商品信息 ...
- 20180518VSTO多簿单表汇总外接程序按钮
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
- 20180518VSTO多簿单表汇总
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
- Hadoop阅读笔记(三)——深入MapReduce排序和单表连接
继上篇了解了使用MapReduce计算平均数以及去重后,我们再来一探MapReduce在排序以及单表关联上的处理方法.在MapReduce系列的第一篇就有说过,MapReduce不仅是一种分布式的计算 ...
- MapReduce应用案例--单表关联
1. 实例描述 单表关联这个实例要求从给出的数据中寻找出所关心的数据,它是对原始数据所包含信息的挖掘. 实例中给出child-parent 表, 求出grandchild-grandparent表. ...
- Web前端开发工程师面试题
Web前端开发工程师面试题1.说说css的优先级?2.在移动端中,常常使用tap作为点击事件,好处是?会带来什么问题?3.原生JS的window,onload与Jquery的$(document).r ...
- Hadoop介绍及最新稳定版Hadoop 2.4.1下载地址及单节点安装
Hadoop介绍 Hadoop是一个能对大量数据进行分布式处理的软件框架.其基本的组成包括hdfs分布式文件系统和可以运行在hdfs文件系统上的MapReduce编程模型,以及基于hdfs和MapR ...
- MapReduce编程系列 — 5:单表关联
1.项目名称: 2.项目数据: chile parentTom LucyTom JackJone LucyJone JackLucy MaryLucy Ben ...
随机推荐
- B树及2-3树的python实现
B树(或称B-树)是一种适用于外查找的树,它是一种平衡的多叉树. 阶为M的B树具有下列结构特征: 1.树的根或者是一片树叶,或者其儿子数在2和M之间. 2.除根节点外的所有非树叶节点儿子数在┌M/2┐ ...
- osg 基本几何图元
转自:osg 基本几何图元 //osg 基本几何图元 // ogs中所有加入场景中的数据都会加入到一个Group类对象中,几何图元作为一个对象由osg::Geode类来组织管理. // 绘制几何图元对 ...
- com.mchange.v2.c3p0.ComboPooledDataSource
C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...
- Nhibernate 一对多,多对一配置
先来分析下问题,这里有两张表:Users(用户表) U和PersonalDynamic(用户动态表) PD,其中PD表的UserId对应U表的Id 如图: 现在映射这两张表: 如图: User.hbm ...
- js去除重复数值
var c=[2,4,3,5,2,2,2], a = {}, i = 0; for(;i<c.length;i++){ a[c[i]] = 1 //利用对象名称不能重复的特性来去重 } c=[] ...
- JavaScript中的Function类型浅析
1. Function类型是js中引用类型之一,每个函数实际上都是Function类型的实例对象,具有自己的属性和方法.正因为函数式对象,所以函数名实际上也是一个指向函数对象的指针. 2. 常用的函数 ...
- 【综述】(MIT博士)林达华老师-"概率模型与计算机视觉”
[综述](MIT博士)林达华老师-"概率模型与计算机视觉” 距上一次邀请中国科学院的樊彬老师为我们撰写图像特征描述符方面的综述(http://www.sigvc.org/bbs/thread ...
- Windows Phone 8 开发环境搭建
原地址:http://blog.csdn.net/md521/article/details/11015139 Windows Phone 8将采用与Windows 8相同的NT内核,这就意味着WP8 ...
- 创建型-生成器模式(Builder)
1.意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.场景描述: 编辑软件的“另存为”功能便是生成器模式的一个体现.例如,Word的另存为功能,可以选择将文件存储 ...
- MSSql2008打开企业管理器出错,具体显示提示无法识别的配置节 system.serviceModel。
MSSql2008打开企业管理器出错详细信息: 标题: 已注册的服务器 ------------------------------ 无法读取此系统上以前注册的服务器的列表.请在“已注册的服务器” ...