hadoop用mutipleInputs实现map读取不同格式的文件

mapmap读取不同格式的文件这个问题一直就有,之前的读取方式是在map里获取文件的名称,按照名称不同分不同的方式读取,例如下面的方式

//取文件名称
InputSplit inputSplit = context.getInputSplit();
String fileName = ((FileSplit) inputSplit).getPath().toString();

if(fileName.contains("track")) {
} else if(fileName.contains("complain3")) {
}

这种方式有两个问题,一是在每读入一条数据的时候都要获取文件的名称,二是要根据名称判断按照什么样的格式进行解析,显得很丑陋,其实hadoop提供了解决这个问题的方法

使用mutipleInputs来解决

public class MutipleInputsTest {

	private static String complain = "/dsap/rawdata/operate/complain3/";
	private static String csOperate = "/dsap/rawdata/creditSystemSearchLog/";
	private static String output = "/dsap/rawdata/mutipleInputsTest/result1";

	public static class Mapper1
    extends Mapper<Object, Text, Text, Text>{

		public void map(Object key, Text value, Context context
                 ) throws IOException, InterruptedException {
			Counter counter = context.getCounter("myCounter", "counter1");
			counter.increment(1l);

		}
	}

	public static class Mapper2
    extends Mapper<Object, Text, Text, Text>{

		public void map(Object key, Text value, Context context
                 ) throws IOException, InterruptedException {
			Counter counter = context.getCounter("myCounter", "counter2");
			counter.increment(1l);

		}
	}

	public static void main(String[] args) throws Exception {

		Configuration conf = new Configuration();
		Job job = new Job(conf, "mutipleInputsTest");
		job.setJarByClass(MutipleInputsTest.class);

		MultipleInputs.addInputPath(job, new Path(complain + "20141217"), TextInputFormat.class, Mapper1.class);
		MultipleInputs.addInputPath(job, new Path(csOperate + "20141217"), TextInputFormat.class, Mapper2.class);
		FileOutputFormat.setOutputPath(job, new Path(output));

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(Text.class);
		job.waitForCompletion(true);

		/**获取自定义counter的大小,如果等于质心的大小,说明质心已经不会发生变化了,则程序停止迭代*/
		long counter1 = job.getCounters().getGroup("myCounter").findCounter("counter1").getValue();
		long counter2 = job.getCounters().getGroup("myCounter").findCounter("counter2").getValue();
		System.out.println("counter:" + counter1 + "\t" + counter2);

	}
}

看一下运行结果

可以看到两个不同格式的文件进入了两个不同的mapper进行处理,这样在两个mapper里就可以只针对某一种格式的文件进行解析了

时间: 2024-10-10 12:38:01

hadoop用mutipleInputs实现map读取不同格式的文件的相关文章

PHP记录和读取JSON格式日志文件

我们有时需要记录用户或者后端的某个操作事件的运行情况,可以使用后端语言如PHP将操作结果记录到日志文件中,方便测试和查找问题.尤其是这些在后端运行的而前端不能直接看到运行结果的,那么就可以用日志文件记录下来,如果你经常跟一些接口开发如支付宝接口.微信卡券接口打交道的话,日志记录就必不可少了. 我们讲的PHP记录日志,就是将日志信息写入到一个日志文件中,区别于内存日志.写入日志的流程是:打开日志文件(如果不存在则新创建),然后将日志内容追加到日志文件的后面,最后关闭日志文件. 本文中,我们将日志内

java读取ini格式的文件

已上图就是ini文件的格式,经常在配置文件中用到. 1.核心代码: /** * 去除ini文件中的注释,以";"或"#"开头,顺便去除UTF-8等文件的BOM头 * @param source * @return */ private static String removeIniComments(String source){ String result = source; if(result.contains(";")){ result =

perl 读取json 格式的文件

使用JSON 模块中的 decode_json 函数,将json文件中的数据解码为perl 中的对象,然后进行处理 代码如下: #!/usr/bin/env perl use JSON; use Encode; my ($json) = @ARGV; my $context; open TXT, $json or die "Can't open $json!\n"; while (<TXT>) { $context .= $_; } close TXT; my $obj =

hadoop输入分片计算(Map Task个数的确定)

作业从JobClient端的submitJobInternal()方法提交作业的同时,调用InputFormat接口的getSplits()方法来创建split.默认是使用InputFormat的子类FileInputFormat来计算分片,而split的默认实现为FileSplit(其父接口为InputSplit).这里要注意,split只是逻辑上的概念,并不对文件做实际的切分.一个split记录了一个Map Task要处理的文件区间,所以分片要记录其对应的文件偏移量以及长度等.每个split

【hadoop】如何向map和reduce脚本传递参数,加载文件和目录

本文主要讲解三个问题: 1 使用Java编写MapReduce程序时,如何向map.reduce函数传递参数. 2 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map.reduce脚本传递参数. 3 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map.reduce脚本传递文件或文件夹. (1) streaming 加载本地单个文件 (2) streaming 加载本地多个文件 (3

matlab读取.mat格式文件

matlab读取.mat格式文件 13.1 数据基本操作 本节介绍基本的数据操作,包括工作区的保存.导入和文件打开.13.1.1 文件的存储 MATLAB支持工作区的保存.用户可以将工作区或工作区中的变量以文件的形式保存,以备在需要时再次导入.保存工作区可以通过菜单进行,也可以通过命令窗口进行. 1. 保存整个工作区 选择File菜单中的Save Workspace As…命令,或者单击工作区浏览器工具栏中的Save,可以将工作区中的变量保存为MAT文件. 2. 保存工作区中的变量 在工作区浏览

MapReduce: map读取文件的过程

我们的输入文件 hello0, 内容如下: xiaowang 28 [email protected][email protected] 38 [email protected][email protected] 100 unknown 逻辑上有3条记录, 它们以@[email protected]分隔. 我们看看数据是如何被map读取的... 1. 默认配置 /* New API */ //conf.set("textinputformat.record.delimiter", &q

Hadoop的HDFS和Map/Reduce

HDFS HDFS是一个具有高度容错性的分布式文件系统,适合部署在廉价的机器上,它具有以下几个特点: 1)适合存储非常大的文件 2)适合流式数据读取,即适合"只写一次,读多次"的数据处理模式 3)适合部署在廉价的机器上 但HDFS不适合以下场景(任何东西都要分两面看,只有适合自己业务的技术才是真正的好技术): 1)不适合存储大量的小文件,因为受Namenode内存大小限制 2)不适合实时数据读取,高吞吐量和实时性是相悖的,HDFS选择前者 3)不适合需要经常修改数据的场景 HDFS的架

如何用.net c# 读取epub格式文件

如何用.net(c#)读取epub格式文件 epub格式是印刷出版界常见的格式,本格式遵循XML原则把网页进行压缩打包. 如何用c#读取epub格式文件是个头疼的问题,本人搜遍各大网站,发现介绍都语焉不详. 因项目中要用的此功能,特做案例整理如下,仅供参考. // 动态库下载地址 https://epubreader.codeplex.com/,添加引用eBdb.EpubReader.dll // 头部增加引用 using eBdb.EpubReader; string fullfile = @