我们照着Hadoop教程简单的写了一个例子,它可以用于分析天气数据然后找到某年的最高气温。
我们是用hadoop 0.20的新的API写的,具体代码如下:
Mapper类:
/* */ package com.charles.parseweather; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; /** * * Description: 这是map类,之中定义了map函数, 这是基于Hadoop0.20的新的API * base class有4个类型参数,分别是输入key,输入value,输出key,输出value的类型 * 在我们的例子中, * 输入key:LongWritable的偏移量,代表某一行起始位置相对于文件起始位置的偏移量 * 输入value: 指定行的单行文本,这里面涵盖了包括气温信息在内的其他信息 * 输出key: 这行中的年份信息 * 输出value:这行中的气温 * *所以对于其中的某一行:比如: *0029029070999991901010106004+64333+023450FM-12+000599999V0202701N015919999999N0000001N9-00781+99999102001ADDGF108991999999999999999999 * 假如每一行都是106个字符,而且这个是第2行,那么 * 输入key 为 106 (偏移量,LongWritable类型) * 输入value 为全部文本 * 输出key:年份信息,这里是第15-19个字符,所以是1901 * 输出value:气温信息,这里是第87-92个字符(因为可能是零下温度),所以是0 (IntWritable类型) * * * @author charles.wang * @created May 24, 2012 5:10:27 PM * */ public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { //定义了一个不可能的气温值,如果这一行的气温是这个数字,则表示这一年没有统计气温 private static final int MISSING = 9999; //这个map方法将(文本偏移量,这行文本)映射为(年份,气温),并且写入Context中 //这里使用了Hadoop自身提供的数据类型,他们的作用只是在网络序列化过程中优化 //但是最终我们还是要吧他们转为java.lang中的基本类型来处理 public void map(LongWritable key,Text value ,Context context) throws IOException ,InterruptedException{ //因为value代表了这行文本,所以我们先要从其中提取信息 //将网络传输的文本转为String类型的行 String line = value.toString(); //从行中提取了年份信息,这个将作为输出的key String year = line.substring(15,19); int airTemperature; //对于气温,因为有正负之分,所以要区别对待,第87位是符号位 //对于正的气温值,从下一个位置开始截取到92位置,然后转为整数类型 //对于负的气温值,直接截取到92位置,然后转为整数类型 if(line.charAt(87) == '+'){ airTemperature = Integer.parseInt(line.substring(88,92)); }else{ airTemperature = Integer.parseInt(line.substring(87,92)); } String quantity = line.substring(92,93); //quantity的参数为正则表达式,quantity.matches("[01459]")表明数量只可能是以0,1,4,5,9才有效 if(airTemperature != MISSING && quantity.matches("[01459]")){ //只把正确的气温数值写入Context对象,写的时候又要转为Hadoop数据类型,因为要通过网络传输到reduce中 //这里可以看出key为年份,value为这一行中包含的气温值 context.write(new Text(year),new IntWritable(airTemperature)); } } }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索类型
, 输入
, 输出
, value
, 偏移
年份
hadoop配置文件详解、hadoop原理详解、hadoop技术详解、hadoop rpc 详解、hadoop shuffle详解,以便于您获取更多的相关知识。
时间: 2024-10-01 07:39:46