hadoop 处理不同的输入文件,文件关联

标签: hadoop 文件 文件关联 | 发表时间:2014-04-10 08:07 | 作者:smile0198
出处:http://blog.csdn.net

类型一: 一一对应

file1:

a  1
b  2
c  3


file2:

1 !
2 @
3 #

file1和file2进行关联,想要的结果:

a  !

b  @

3  #


思路:

1、标记不同输入文件

2、将file1的key、value颠倒 ;file1和file2的key相同,file1的value做key,file2的value做value ,输出。

程序:

package smiple;

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
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.FileSplit;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class FileJoin {

	public static class MyMap extends Mapper<LongWritable , Text, Text, Text> {

		public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {
//			String line = value.toString();
			String line=new String(value.getBytes(),0,value.getLength(),"GBK");
			StringTokenizer tokenizer = new StringTokenizer(line);
			String keystr = tokenizer.nextToken();
			String valuestr = tokenizer.nextToken();
			
			//获取文件名
			InputSplit inputSplit = context.getInputSplit();
			String fileName = ((FileSplit) inputSplit).getPath().getName();
			
			
			if("file1".equals(fileName)){//加标记
				context.write(new Text(valuestr),new Text("file1_"+keystr));
			}else if("file2".equals(fileName)){
				context.write(new Text(keystr), new Text("file2_"+valuestr));
			}
			
		}
	}

	public static class MyReduce extends Reducer<Text, Text, Text, Text> {

		public void reduce(Text key, Iterable<Text> values,Context context) throws IOException, InterruptedException {
			Text resultKey = new Text("key0");
			Text resultValue = new Text("value0");
			for (Text val : values) {
				if("file1_".equals(val.toString().substring(0, 6))){
					resultKey = new Text(val.toString().substring(6));
				}else if("file2_".equals(val.toString().substring(0, 6))){
					resultValue = new Text(val.toString().substring(6));
				}
			}
			System.out.println(resultKey.toString()+"   " + resultValue.toString());
			context.write(resultKey, resultValue);
		}
	}

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		String[] ioArgs = new String[] { "hdfs://ip:port/mr/join/in","hdfs://ip:port/mr/join/out" };
		String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();

		if (otherArgs.length != 2) {
			System.err.println("Usage: Data Sort <in> <out>");
			System.exit(2);
		}
		Job job = new Job(conf, "file join ");

		job.setJarByClass(Sort.class);

		// 设置Map和Reduce处理类
		job.setMapperClass(MyMap.class);
		job.setReducerClass(MyReduce.class);

		// 设置输出类型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);

		// 设置输入和输出目录
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

		System.exit(job.waitForCompletion(true) ? 0 : 1);

	}

}

结果:




作者:smile0198 发表于2014-4-10 0:07:10 原文链接
阅读:171 评论:0 查看评论

相关 [hadoop 文件 文件关联] 推荐:

hadoop 处理不同的输入文件,文件关联

- - CSDN博客云计算推荐文章
file1和file2进行关联,想要的结果:. 2、将file1的key、value颠倒 ;file1和file2的key相同,file1的value做key,file2的value做value ,输出. if("file1".equals(fileName)){//加标记. // 设置Map和Reduce处理类.

hadoop多文件输出

- - CSDN博客云计算推荐文章
现实环境中,常常遇到一个问题就是想使用多个Reduce,但是迫于setup和cleanup在每一个Reduce中会调用一次,只能设置一个Reduce,无法是实现负载均衡. 问题,如果要在reduce中输出两种文件,一种是标志,另一种是正常业务数据,实现方案有三种:. (1)设置一个reduce,在reduce中将数据封装到一个集合中,在cleanup中将数据写入到hdfs中,但是如果数据量巨大,一个reduce无法充分利用资源,实现负载均衡,但是如果数据量较小,可以使用.

hadoop多文件格式输入

- - CSDN博客云计算推荐文章
hadoop多文件格式输入,一般可以使用MultipleInputs类指定不同的输入文件路径以及输入文件格式. 现在需要把user和phone按照phone number连接起来,得到下面的结果:. 那么就可以使用MultipleInputs来操作,这里把user和phone上传到hdfs目录中,分别是/multiple/user/user , /multiple/phone/phone.

用Hadoop AVRO进行大量小文件的处理

- - CSDN博客云计算推荐文章
使用 使用使用 使用 HDFS 保存大量小文件的缺点:. 1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据. 据统计,每一个文件需要消耗 NameNode600 字节内存. 如果需要保存大量的小文件会对NameNode 造成极大的压力. 2.如果采用 Hadoop MapReduce 进行小文件的处理,那么 Mapper 的个数就会跟小文件的个数成线性相关(备注:FileInputFormat 默认只对大于 HDFS Block Size的文件进行划分).

hadoop集群调优-OS和文件系统部分

- - 开源软件 - ITeye博客
根据Dell(因为我们的硬件采用dell的方案)关于hadoop调优的相关说明,改变几个Linux的默认设置,Hadoop的性能能够增长大概15%. 文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表. 当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符.

Hadoop 归档 和HIVE 如何使用har 归档 文件

- - CSDN博客云计算推荐文章
但对于MapReduce 来说起不到任何作用,因为har文件就相当一个目录,仍然不能讲小文件合并到一个split中去,一个小文件一个split ,任然是低效的,这里要说一点<>对这个翻译有问题,上面说可以分配到一个split中去,但是低效的.      既然有优势自然也有劣势,这里不说它的不足之处,仅介绍如果使用har 并在hadoop中更好的使用har 文件.

大数据-Hadoop小文件问题解决方案

- - IT瘾-geek
HDFS中小文件是指文件size小于HDFS上block(. dfs.block.size)大小的文件. 大量的小文件会给Hadoop的扩展性和性能带来严重的影响. 动态分区插入数据,产生大量的小文件,从而导致map数量剧增. reduce数量越多,小文件也越多,reduce的个数和输出文件个数一致.

[原]基于hadoop搜索引擎实践——二级索引文件(五)

- - long1657的专栏
基于hadoop搜索引擎——二级索引文件.     一般生成的倒排表文件会比源文件暂用空间大,主要是倒排表文件所记录的信息比较详细. 它记录了所有的索引词记录(TERM_RECORD)信息,对于常见的关键词(TERM),其MULTI_INFO可能包含几万甚至几十万个SINGLE_INFO..     由于倒排表文件很大.

Hadoop分布式文件系统HDFS和OpenStack对象存储系统Swift有何不同?

- - ITeye博客
HDFS使用 集中式单一节点架构(NameNode)来维护文件系统元数据,而在Swift中,元数据 分布在整个集群中并拥有多个副本. 注意:集中式元数据存储使HDFS存在单点故障和扩展性问题,因此规模越大就性能越低,就越难扩展甚至不能扩展,所幸的是HDFS2使用NameNode HA和HDFS Federation解决了这两个问题.

比较Apache Hadoop 生态系统中不同的文件格式和存储引擎的性能

- - IT瘾-bigdata
这篇文章提出了在Apache Hadoop 生态系统中对比一些当前流行的数据格式和可用的存储引擎的性能:Apache Avro, Apache Parquet, Apache HBase 和 Apache Kudu 空间效率, 提取性能, 分析扫描以及随机数据查找等领域. 这有助于理解它们中的每一个如何(何时)改善你的大数据工作负载的处理能力.