• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > MapReduce对输入多文件的处理,mapreduce输入处理

MapReduce对输入多文件的处理,mapreduce输入处理

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含mapreduce 多文件输入,mapreduce 找不到文件,node mapreduce,mapreduce,mapreduce是什么等服务器相关知识,网友希望可以进行参考

MapReduce对输入多文件的处理,mapreduce输入处理


 MultipleInputs类指定不同的输入文件路径以及输入文化格式
 现有两份数据
 phone
 123,good number
 124,common number
 125,bad number

 user
 zhangsan,123
 lisi,124
 wangwu,125

 现在需要把user和phone按照phone number连接起来。得到下面的结果
 zhangsan,123,good number
 lisi,123,common number
 wangwu,125,bad number

 

分析思路

还是相当于两张表的一对一join操作。join时对value设置个Bean(JavaBean实现writablecomparable接口),key为外键值

join的优化,详见http://blog.csdn.net/u010366796/article/details/44649933,设置KeyBean(外健和标识flag属性),进行排序

本例中将通过value进行排序,即在value的JavaBean中通过实习CompareTo()方法,完成排序,使得phone表位于首位

 

1.对value实现JavaBean(实现writablecomparable接口)

package test.mr.multiinputs;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

/*
 * 自定义的JavaBean
 */
public class FlagString implements WritableComparable<FlagString> {
	private String value;
	private int flag; // 标记 0:表示phone表 1:表示user表

	public FlagString() {
		super();
		// TODO Auto-generated constructor stub
	}

	public FlagString(String value, int flag) {
		super();
		this.value = value;
		this.flag = flag;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public int getFlag() {
		return flag;
	}

	public void setFlag(int flag) {
		this.flag = flag;
	}

	@Override
	public void write(DataOutput out) throws IOException {
		out.writeInt(flag);
		out.writeUTF(value);

	}

	@Override
	public void readFields(DataInput in) throws IOException {
		this.flag = in.readInt();
		this.value = in.readUTF();
	}

	@Override
	public int compareTo(FlagString o) {
		if (this.flag >= o.getFlag()) {
			if (this.flag > o.getFlag()) {
				return 1;
			}
		} else {
			return -1;
		}
		return this.value.compareTo(o.getValue());
	}

}


2.多map类,map1(实现对phone表文件操作)

package test.mr.multiinputs;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MultiMap1 extends Mapper<LongWritable, Text, Text, FlagString> {
	private String delimiter; // 定义分隔符,由job端设置

	@Override
	protected void setup(
			Mapper<LongWritable, Text, Text, FlagString>.Context context)
			throws IOException, InterruptedException {
		delimiter = context.getConfiguration().get("delimiter", ",");
	}

	@Override
	protected void map(LongWritable key, Text value,
			Mapper<LongWritable, Text, Text, FlagString>.Context context)
			throws IOException, InterruptedException {
		String line = value.toString().trim();
		if (line.length() > 0) {
			String[] str = line.split(delimiter);
			if (str.length == 2) {
				context.write(new Text(str[0].trim()),
						new FlagString(str[1].trim(), 0)); // flag=0,表示phone表
			}
		}
	}
}


2.map2(实现对user表文件操作)

package test.mr.multiinputs;

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class MultiMap2 extends Mapper<LongWritable, Text, Text, FlagString> {
	private String delimiter; // 设置分隔符

	@Override
	protected void setup(
			Mapper<LongWritable, Text, Text, FlagString>.Context context)
			throws IOException, InterruptedException {
		delimiter = context.getConfiguration().get("delimiter", ",");
	}

	@Override
	protected void map(LongWritable key, Text value,
			Mapper<LongWritable, Text, Text, FlagString>.Context context)
			throws IOException, InterruptedException {
		String line = value.toString().trim();
		if (line.length() > 0) {
			String[] str = line.split(delimiter);
			if (str.length == 2) {
				context.write(new Text(str[1].trim()),
						new FlagString(str[0].trim(), 1)); // flag=1为user表
			}
		}
	}
}


3.reduce类

package test.mr.multiinputs;

import java.io.IOException;

import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class MultiRedu extends Reducer<Text, FlagString, NullWritable, Text> {
	private String delimiter; // 设置分隔符

	@Override
	protected void setup(
			Reducer<Text, FlagString, NullWritable, Text>.Context context)
			throws IOException, InterruptedException {
		delimiter = context.getConfiguration().get("delimiter", ",");
	}

	@Override
	protected void reduce(Text key, Iterable<FlagString> values,
			Reducer<Text, FlagString, NullWritable, Text>.Context context)
			throws IOException, InterruptedException {
		// 最后输出的格式为: uservalue,key,phonevalue
		String phoneValue = "";
		String userValue = "";
		int num = 0;
		for (FlagString value : values) {
			// 第一个即为phone表
			if (num == 0) {
				phoneValue = value.getValue();
				num++;
			} else {
				userValue = value.getValue();
				context.write(NullWritable.get(),
						new Text(userValue + key.toString() + phoneValue));
			}
		}
	}
}


4.job类(关键!!实现多文件的输入格式等)

package test.mr.multiinputs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

/*
 * MultipleInputs类指定不同的输入文件路径以及输入文化格式
 现有两份数据
 phone
 123,good number
 124,common number
 123,bad number

 user
 zhangsan,123
 lisi,124
 wangwu,125

 现在需要把user和phone按照phone number连接起来。得到下面的结果
 zhangsan,123,good number
 lisi,123,common number
 wangwu,125,bad number
 */
public class MultiMapMain extends Configuration implements Tool {
	private String input1 = null; // 定义的多个输入文件
	private String input2 = null;
	private String output = null;
	private String delimiter = null;

	@Override
	public void setConf(Configuration conf) {

	}

	@Override
	public Configuration getConf() {
		return new Configuration();
	}

	@Override
	public int run(String[] args) throws Exception {
		setArgs(args);
		checkParam();// 对参数进行检测

		Configuration conf = new Configuration();
		Job job = new Job(conf);
		job.setJarByClass(MultiMapMain.class);

		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(FlagString.class);

		job.setReducerClass(MultiRedu.class);
		job.setOutputKeyClass(NullWritable.class);
		job.setOutputValueClass(Text.class);

		// MultipleInputs类添加文件路径
		MultipleInputs.addInputPath(job, new Path(input1),
				TextInputFormat.class, MultiMap1.class);
		MultipleInputs.addInputPath(job, new Path(input2),
				TextInputFormat.class, MultiMap2.class);

		FileOutputFormat.setOutputPath(job, new Path(output));
		job.waitForCompletion(true);
		return 0;
	}

	private void checkParam() {
		if (input1 == null || "".equals(input1.trim())) {
			System.out.println("no input phone-data path");
			userMaunel();
			System.exit(-1);
		}
		if (input2 == null || "".equals
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MapReduce对输入多文件的处理,mapreduce输入处理

相关文章

  • Name node is in safe mode.错误处理方式 hadoop,nodehadoop
  • Centos 安装R 集成 Hadoop、RHive 配置安装手册,centoshadoop
  • 基于 ssh + Xpra 构建 Docker 桌面系统,xpradocker
  • CSR1000V在XenServer的安装和简单使用,csr1000vxenserver
  • 一篇博文简单了解weka,博文简单weka
  • 【hadoop】 3002-mapreduce程序统计单词个数示例,hadoopmapreduce
  • Hive 外部表 分区表,hive外部表分区表
  • 实战第一个云程序,实战第一个云
  • 推荐引擎mahout安装与配置,引擎mahout配置
  • (Kilo)Devstack Kilo版本localrc推荐,devstacklocalrc

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • CentOS 下面解决libvirt版本过低、升级冲突问题,centoslibvirt
    • Ambari Metrics介绍,ambarimetrics介绍
    • 如何创造自己的数据字典(词库转换工具的使用),创造自己工具的使用
    • HBase常用操作之namespace,hbasenamespace
    • Scala非值类型,Scala值类型
    • Hadoop学习总结,hadoop总结
    • Hadoop之——有趣问答(一),hadoop问答
    • Hbase shell操作(完整版记录),hbaseshell
    • Nodejs课堂笔记-第六课 在DynamoDB中如何创建表,nodejsdynamodb
    • http content length,contentlength

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有