hadoop自定义输入格

hadoop编程小技巧(5)---自定义输入文件格式类InputFormat Hadoop代码测试环境:Hadoop2.4应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类。Hadoop内置的输入文件格式类有:1)FileInputFormat这个是基本的父类,我们自定义就直接使用它作为父类;2)TextInputFormat这个是默认的数据格式类,我们一般编程,如果没有特别指定的话,一般都使用的是这个;key代表当前行数据距离文件开始的距离, 阅读详情

关于hadoop的自定义输入格式:

之前在网上找过很多教程,但是大多数都是在不支持分片的前提下进行自定义输入。本文实现了一种在能够分片的基础上支持自定义输入格式的方法。

先贴代码:


import java.io.IOException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.Seekable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.compress.CodecPool;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionCodecFactory;
import org.apache.hadoop.io.compress.Decompressor;
import org.apache.hadoop.io.compress.SplitCompressionInputStream;
import org.apache.hadoop.io.compress.SplittableCompressionCodec;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.util.LineReader;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;

public class ZInputFormat extends FileInputFormat<IntWritable,IntWritable>{
		
		@Override
		public RecordReader<IntWritable, IntWritable> createRecordReader(
				InputSplit split, TaskAttemptContext context)
				throws IOException, InterruptedException {
			return new ZRecordReader();
		}

		//自定义的数据类型
		public static class ZRecordReader extends RecordReader<IntWritable,IntWritable>
		{
			//data
			private LineReader in;		//输入流
			private boolean more = true;//提示后续还有没有数据
			
			private IntWritable key = null;
			private IntWritable value = null;
			
			//这三个保存当前读取到位置(即文件中的位置)
			private long start;
			private long end;
			private long pos;
			
			private Log LOG = LogFactory.getLog(ZRecordReader.class);//日志写入系统,可加可不加
						
			@Override
			public void initialize(InputSplit split, TaskAttemptContext context)
					throws IOException, InterruptedException {
				// 初始化函数
				
				FileSplit inputsplit = (FileSplit)split;
				start = inputsplit.getStart();						//得到此分片开始位置
				end   = start + inputsplit.getLength();//结束此分片位置
				final Path file = inputsplit.getPath();
		
				// 打开文件
				FileSystem fs = file.getFileSystem(context.getConfiguration());
				FSDataInputStream fileIn = fs.open(inputsplit.getPath());
				
				//关键位置2
				//将文件指针移动到当前分片,因为每次默认打开文件时,其指针指向开头
				fileIn.seek(start);
				
				in = new LineReader(fileIn, context.getConfiguration());

				if (start != 0) 
			    {
				  System.out.println("4");
				  	//关键解决位置1
				   //如果这不是第一个分片,那么假设第一个分片是0——4,那么,第4个位置已经被读取,则需要跳过4,否则会产生读入错误,因为你回头又去读之前读过的地方
			   start += in.readLine(new Text(), 0, maxBytesToConsume(start));
			    }
				pos = start;
			}
			
			private int maxBytesToConsume(long pos) 
			{
				    return (int) Math.min(Integer.MAX_VALUE, end - pos);
			 }
			
			@Override
			public boolean nextKeyValue() throws IOException,
					InterruptedException {
				//下一组值
				//tips:以后在这种函数中最好不要有输出,费时
				//LOG.info("正在读取下一个,嘿嘿");
				if(null == key)
				{
					key = new IntWritable();
				}
				if(null == value)
				{
					value = new IntWritable();
				}
				Text nowline = new Text();//保存当前行的内容
				int readsize = in.readLine(nowline);
				//更新当前读取到位置
				pos += readsize;
				
				//关键位置3
				//如果pos的值大于等于end,说明此分片已经读取完毕
				if(pos >= end)
				{
					more = false;
					return false;
				}
				
				if(0 == readsize)
				{
					key = null;
					value = null;
					more = false;//说明此时已经读取到文件末尾,则more为false
					return false;
				}
				String[] keyandvalue = nowline.toString().split(",");
				
				//排除第一行
				if(keyandvalue[0].endsWith("\"CITING\""))
				{
					readsize = in.readLine(nowline);
					//更新当前读取到位置
					pos += readsize;
					if(0 == readsize)
					{
						more = false;//说明此时已经读取到文件末尾,则more为false
						return false;
					}
					//重新划分
					keyandvalue = nowline.toString().split(",");
				}
				
				//得到key和value
				//LOG.info("key is :" + key +"value is" + value);
				key.set(Integer.parseInt(keyandvalue[0]));
				value.set(Integer.parseInt(keyandvalue[1]));
				
				return true;
			}

			@Override
			public IntWritable getCurrentKey() throws IOException,
					InterruptedException {
				//得到当前的Key
				return key;
			}

			@Override
			public IntWritable getCurrentValue() throws IOException,
					InterruptedException {
				//得到当前的value
				return value;
			}

			@Override
			public float getProgress() throws IOException, InterruptedException {
				//计算对于当前片的处理进度
				if( false == more || end == start)
				{
					return 0f;
				}
				else
				{
					return Math.min(1.0f, (pos - start)/(end - start));
				}
			}

			@Override
			public void close() throws IOException {
				//关闭此输入流
				if(null != in)
				{
					in.close();
				}
			}
			
		}
}

代码重要注意的几点:

1、注释为“关键位置x(1,2,3)”的三处位置,是能够实现在分片的模式下实现自定义输入的关键,这也是和网上大多数流传的教程的不同之处。

PS:写出这段代码用了2天,在网上找了不少资料,最后发现还是系统自带的输入格式文件最管用。其实对比一下,这个和KeyValueTextInputFormat类的实现大同小异,只不         过去除了压缩判定部分。

PSS:感谢那些写教程的人们~嘿嘿

干货--Hadoop自定义数据类型和自定义输入输出格式整合项目案例 数据输入格式(InputFormat) 用于描述MapReduce作业的数据输入规范。MapReduce框架依靠数据输入格式完成输入规范检查(比如输入文件目录的检查)、对数据文件进行输入分块(也叫分片,InputSplit),以及提供从输入分块(分片)中将数据记录逐一读出,并转化为Map过程的输入键值对等功能 Hadoop提供了丰富的内置数据输入格式。最常用的数据输入格式包括:TextInputFormat和KeyValueInputFormat TextInputFormat是系统默认的数据输入格式,可 阅读详情

相关推荐

MapReduce工作笔记——Hadoop Streaming多目录/多路输入

文章目录0. 前言1. 使用通配符*2. 逗号分割3. 输入数组形式4. 总结 MapReduce工作笔记 系列目录:MapReduce工作笔记——目录 0. 前言 在工作中时常会遇到一个job需要多路径的输入,比如计算CTR,需要PV、Click的输入路径,或者是想对一周的数据做Merge等, 下面将提供三种方法来完成多目录/多路输入。 比如,我路径下有如下共12个文件: $ hls /h...

Congying-Wang的博客 7232

Hadoop自定义数据类型和输入格式

Hadoop自定义数据类型和输入格式 一,自定义一个数据类型:User类 该类实现WritableComparable接口,并且带三个属性:name,sex,age 重写其write(),readFields(),compareTo()方法,分别对应 写出文件格式,读文件的格式,和比较该对象的值 设置其属性的get()与set()方法。

young_so_nice的博客 3268

hadoop 自定义分区

hadoop 自定义分区总结

congge 1万+

MapReduce的编程开发——自定义格式输入输出

通过MapReduce对数据进行格式读取和格式输出

Comet_sgf的程序员之路 678

三运放仪表放大器电路设计全解析:从原理到PCB布局避坑指南

本文深度解析三运放仪表放大器电路设计,从差分放大器原理演进到经典三运放架构,详细阐述了其高共模抑制比(CMRR)和高输入阻抗的核心优势。文章重点剖析了电阻匹配、PCB布局对称性等关键设计要点对性能的影响,并提供了基于LTspice的仿真分析与从原理图到PCB布局、焊接调试的全流程实战避坑指南,助力实现高精度信号调理。

redis7keeper的博客 787

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)

最后我觉得这个项目最重要的部分还是陀螺仪的精准度,如果一个陀螺仪的精准度高,这个项目就十分简单了,像mpu6050这种陀螺仪精准度就稍微差了一点,他有个最严重的问题就是温漂,偏航角会随着温度变化为变化,这一点在跑发挥项一的时候十分关键的,因为这个只差基督就会导致车子跑偏,导致无法完成 整个项目。如果条件足够的话建议可以换一个好一点的陀螺仪,然后就是灰度如果没有条件同样也可以换成红外。以上就是本次项目的一些小建议。

weixin_60991529的博客 6243

Hadoop之自定义InputFormat

一、前提: 无论HDFS还是MapReduce,在处理小文件时效率都非常低,但又难免面临处理大量小文件的场景,此时,系统提供的InputFor就不适用了,就需要有相应解决方案。可以自定义InputFormat实现小文件的合并。 二、需求: 将多个小文件合并成一个SequenceFile文件(SequenceFile文件是Hadoop用来存储二进制形式的key-value对的文件格式),SequenceFile里面存储着多个文件,存储的形式为文件路径+名称为key,文件内容为value。 ...

Hao_JunJie的博客 1万+

【CODESYS】-软件Bug与处理方法(20240710更)

【CODESYS】-软件Bug与处理方法(不定期更新)

qq_35316470的博客 5185

Hadoop输入格式深度解析:默认输入格式与自定义实战

在Hadoop MapReduce框架中,输入格式(InputFormat) 是数据处理的起点,它决定了如何读取、分割和解析输入数据。正确选择或设计输入格式,直接影响作业的并行度、数据本地性和处理效率。本文将深入剖析Hadoop的默认输入格式的工作原理,并通过完整的实战案例展示如何自定义输入格式来解决特定业务场景中的问题。输入格式InputFormat核心功能验证输入路径将文件切分为分片提供RecordReader记录解析逻辑默认实现TextInputFormatKeyValueTextInputForma

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3467

海康线扫相机平场矫正实战:从原理到精准成像

本文深入解析了海康线扫相机平场矫正的原理与实战操作。通过拆解暗场与明场矫正的物理意义,揭示了其消除系统噪声、补偿像素响应不均的核心机制。文章详细指导了在海康相机上进行平场矫正的标准化流程、关键参数设置(如行高、灰度值控制)及常见误区,并提供了针对高行频匹配、环境稳定性维护等进阶调优技巧与问题排查指南,旨在帮助用户实现从原理理解到精准成像的跨越。

tomato的博客 790

Deeplabv3+改进1:添加CBAM注意力机制|有效涨点

我们提出卷积块注意力模块(CBAM),这是一种简单而有效的前馈卷积神经网络注意力模块。给定一个中间特征图,我们的模块会依次沿两个独立维度(通道和空间)推断注意力图,然后将注意力图与输入特征图相乘,以实现自适应特征细化。由于 CBAM 是一个轻量级且通用的模块,它可以无缝集成到任何 CNN 架构中,几乎不会增加开销,并且可以与基础 CNN 一起端到端训练。我们通过在 ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上进行的大量实验验证了 CBAM。

AIcurator的博客 1691

Hadoop 3.x 默认输入格式与自定义输入格式详解

一、默认输入格式:TextInputFormatHadoop 3.x 延续了作为默认输入格式,专为处理文本数据设计,适用于日志文件、CSV 等场景。核心特性记录划分规则按行分割文本文件,每行为一条记录。Key 类型为(表示行起始字节偏移量)。Value 类型为Text(存储行内容)。分片策略基于 HDFS 块大小(默认 128MB)生成InputSplit。自动处理跨块的完整行:若某行跨越两个块,分片会从下一块的起始位置开始读取,确保数据完整性。压缩支持。

weixin_45422672的博客 955

DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)

【代码】DeepSeek R1-32B医疗大模型的完整微调实战指南(全码版)

AllenLV的博客 5102

Hadoop:自定义输入文件格式类InputFormat

hadoop如何自定义输入文件格式类InputFormat

kydkong的博客 1936

Qt插件之Qt Designer插件实现

相比于通过控件提升来使用自定义控件,在Qt Designer中直接使用自定义控件更加方便和直观。这里就介绍一下如编写和注册Qt Designer插件。Qt Designer插件本质上来说就是一个动态库,和普通的动态库的区别是插件中导出了Qt Designer能识别的接口。...

yang1fei2的博客 3100

一文吃透 ABAP CDS SELECT:语法全景、关联与去重、可运行示例与实战心法

摘要: 本文深入解析ABAP中CDS视图的SELECT语法,重点介绍两种等价写法、关联与路径表达式优化、DISTINCT去重逻辑及WHERE/GROUP BY/HAVING/UNION等子句的应用。通过可运行的业务伙伴角色去重、关联路径查询及多角色筛选示例,演示如何将CDS特性转化为项目实践。强调关联复用性优于传统JOIN,并指出DISTINCT的权限边界与误用场景,帮助开发者从行式思维转向图式数据建模。(150字) 关键词: ABAP CDS、SELECT语法、路径表达式、DISTINCT去重、关联复用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 392

了解Hadoop数据类型,输入输出格式及用户如何自定义。

一:Hadoop内置的数据类型。     Hadoop提供如下内置的数据类型,这些数据类型都实现了WritableComparable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,以及进行大小比较。 BooleanWritable 标准布尔型数值 ByteWritable 单字节数值 DoubleWritable 双字节数 F

bbaiggey_bigdata的博客 3176

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

hadoop自定义文件的输入格式

首先还是先讲下hadoop的文件输入经过这么个过程处理的,文件——>splits划分成N多inputsplit(这就是每个mapper处理的数据单元)——>RecordReader划分成M多对(每次map()函数处理的数据单元)。hadoop默认使用的是TextInputFormat的格式继承了FileInputFormat,要实现自己的文件输入格式,就需要继承FileInputFormat类.。

A-Three 811

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Hadoop自定义输入格式

MapReduce默认的输入格式为TextInputFormat。他的每条记录是一行输入。键是 LongWritable 类型,存储该行在整个文件中的字节偏移量。 值是这行的内容,不包括任何行终止符(换行符、回车符),它被打包成一个 Text 对象。有时默认的输入格式不能满足我们的需求,例如我们想要的输入格式为:文件名为key、文件的每一行内容为 value。下面我们来通过自定义输入格式来满足我们...

czy的博客 353

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Hadoop 自定义数据类型及输入格式

Hadoop提供了大量的数据输入类型,如Text和IntWritable.   假如我们需要自定义一个数据类型,首先要实现Writable接口,主要包含两个函数readFields和write.如果需要把新的数据类型作为Map函数的key输出的话,在shuffle阶段会有一个排序的过程,需要对key进行比较,那么这里就推荐实现WritableComparable接口,它比Writable接口多一

浮躁的人,终究一事无成! 674

Hadoop之自定义输入InputFormat

3.程序实现 (1)自定义InputFromat package com.hadoop.mapreduce.inputformat; import java.io.IOException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.BytesWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.mapreduce.InputS.

蒯厅博客 318

Hadoop-MapReduce的自定义输入输出

如果输出有二进制,就使用下面二进制流,如果没有,就使用默认的TextOuttputFormat;注意 这里使用的是自定义的,所以每写一次的内容不会自动换行,所以每个文件的内容都会拼接在一起,注意 我们是自定义输出的,写出去的数据所有的内容会拼接在一起,所以key要加换行。因为读取的就是文本类型的,而默认TextIntputFormat,所以略写,*/获取job里面传递的输出目录,并且job的输出路径的产生下面自定义的文件名。如果输入有二进制,就使用下面二进制流,如果没有,就不用写,

互联网知识分享 946

MapReduce自定义输入格式和自定义输出格式

文章目录需求编写自定义输出格式编写自定义记录读取器Mapper类Reducer类设置Driver执行结果 需求 将下面的三个文件的内容读取到一个SequenceFile中,SequenceFile是hadoop中特有的文件格式,适合key-value的存储。比普通文件格式节省空间。现在默认的输出格式是TextOutputFormat(文本格式的输出),改为SequenceFileOutputFormat。将输入目录的文件读取key-value(bytes)形式,将文件的内容读取封装为bytes类型,然后将文

ygp12345的博客 1995

Hadoop之自定义输入数据(一)

默认KeyValueTextInputFormat的数据输入是通过,空格来截取,区分key和value的值,这里我们通过自定义来实现通过 “,”来截取。 一,准备文件数据: 2,自定义MyFileInputFormat类: import java.io.IOException; import org.apache.hadoop.io.Text; import org.ap

young_so_nice的博客 753

Hadoop入门——MapReduce的输入与输出

一.MapReduce的输入处理类 (1)FileInputFormat FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。 (2)InputFormat InputForm...

东天里的冬天 2226

在Hadoop中处理输入的CSV文件

No Reply , Posted in Hadoop on December 2, 2012 在Hadoop中,InputFormat类用来生成可供Mapper处理的键值对。当数据传送给Mapper时,Mapper会将输入分片传送到InputFormat上,InputFormat调用getRecordReader()方法生成RecordReader,RecordReader再创建可供map

hkmaike的专栏 1万+
上一篇: Hadoop学习知识点记录
下一篇: 题目1012:畅通工程
canglingye
博客等级 码龄15年 11粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值