本文介绍通过AWK和MapReduce两种方式统计出每年温度到最高气温直。awk速度虽然快,而且简短,但是数据量巨大到时候,就遇到力瓶颈,及时分布式执行awk脚本,也会出现机器死掉等问题,需要容错机制保障分布式运行,所以就出现力MapReduce计算模型到Hadoop机制。

1 数据集样式

++023450FM-+000599999V0202701N015919999999N0000001N9-+99999102001ADDGF108991999999999999999999
++023450FM-+000599999V0202901N008219999999N0000001N9-+99999102001ADDGF104991999999999999999999
++023450FM-+000599999V0209991C000019999999N0000001N9-+99999102001ADDGF108991999999999999999999

为了方便存储,上图所示为压缩样式,需要提取出相关字段:时间和温度。

2 AWK是linux系统有力到文本分析工具,awk逐行读入,以空格分割变量。对不了解awk到人,下面总结了一些基础知识。

(1)统计一年到最高气温:

#!/usr/bin/env bash
  gunzip -c ' | \
    awk '{ temp = substr($0, 88, 5) + 0;
           q = substr($, , );
            && q ~ /[]/ && temp > max) max = temp }
         END { print max }'

输入是.gz的压缩包,输出结果是:317

(2)统计多年到最高气温:

#!/usr/bin/env bash

for year in *.gz
do
  echo $year
  gunzip -c $year | \
    awk '{temp = substr($0, 88, 5) + 0;
          q = substr($, , );
           && q ~ /[]/ && temp > max) max =  temp}
         END { print max}'
done

输入是多年到数据,实例为两年到1901.gz  1902.gz 数据,输出每年到最高气温,37, 44

3 MapReduce计算模型求最高气温

(1)MaxTemperatureMapper.java

public class MaxTemperatureMapper extends Mapper<Object, Text, Text, IntWritable> {

    ;

    @Override
    protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        String year = line.substring(, );
        ;
        ) == '+'){
            airTemperature = Integer.parseInt( line.substring(,) );
        }else {
            airTemperature = Integer.parseInt(line.substring(, ));
        }
        String quality = line.substring(, );
        if (airTemperature != MISSING && quality.matches("[01459]")) {
            context.write(new Text(year), new IntWritable(airTemperature));
        }
    }

}

(2)MaxTemperatureReducer.java

public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable>{

    @Override
    protected void reduce(Text arg0, Iterable<IntWritable> arg1,
            Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {

        int max = Integer.MIN_VALUE;
        for (IntWritable temp : arg1){
            max = Math.max(temp.get(), max);
        }
        context.write(arg0, new IntWritable(max));
    }

}

(3)MaxTemperature.java

public class MaxTemperature {

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

        args = new String[] {
                "/home/hadoop/Develop/hadoop-develop/data-authorized/input-file/file",
                "/home/hadoop/Develop/hadoop-develop/data-authorized/output/maxtemperature" };
        ) {
            System.err.println("Usage: MaxTemperature <input path> <output path>");
            System.exit(-);
        }

        Job job = new Job();
        job.setJarByClass(MaxTemperature.class);
        job.setJobName("Max temperature");

        FileInputFormat.addInputPath(job, ]));
        FileOutputFormat.setOutputPath(job, ]));

        job.setMapperClass(MaxTemperatureMapper.class);
        job.setReducerClass(MaxTemperatureReducer.class);
        job.setCombinerClass(MaxTemperatureReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        System.exit(job.waitForCompletion( : );

    }

}

(4)运行结果,成功

// :: INFO mapred.Task: Task 'attempt_local184459823_0001_r_000000_0' done.
// :: INFO mapred.LocalJobRunner: Finishing task: attempt_local184459823_0001_r_000000_0
// :: INFO mapred.LocalJobRunner: reduce task executor complete.
// :: INFO mapreduce.Job:  map % reduce %
// :: INFO mapreduce.Job: Job job_local184459823_0001 completed successfully

4 附录-awk基础

基本语法 awk -F '分隔符' '{命令}' 路径

(1)awk输出管道last输入流到第一个变量

last -n  | awk  '{print $1}'

(2)-F指定分隔符:

cat /etc/passwd |awk  -F ':'  '{print $1}'

(3)begin和 end 可以分别指定开始和结束执行到一段命令;中间{}部分逐行执行。

cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'

(4)正则模式匹配,以root开头到行

awk -F: '/^root/' /etc/passwd

正则+命令到格式

awk -F: '/root/{print $7}' /etc/passwd

(5)if语句

ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' 

(6)for语句和数组

awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd

(7)awk内部变量表

ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符

包含内部变量到格式

#awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd

参考: 《hadoop权威指南》

   

Hadoop编程1:天气数据AWK & MapReduce的更多相关文章

  1. 大数据学习笔记——Hadoop编程实战之Mapreduce

    Hadoop编程实战——Mapreduce基本功能实现 此篇博客承接上一篇总结的HDFS编程实战,将会详细地对mapreduce的各种数据分析功能进行一个整理,由于实际工作中并不会过多地涉及原理,因此 ...

  2. hadoop编程技巧(6)---处理大量的小型数据文件CombineFileInputFormat申请书

    代码测试环境:Hadoop2.4 应用场景:当需要处理非常多的小数据文件,这种技术的目的,可以被应用到实现高效的数据处理. 原理:申请书CombineFileInputFormat,能够进行切片合并的 ...

  3. Hadoop学习之旅三:MapReduce

    MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...

  4. 后Hadoop时代的大数据架构(转)

    原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞       提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年 ...

  5. Hadoop学习记录(4)|MapReduce原理|API操作使用

    MapReduce概念 MapReduce是一种分布式计算模型,由谷歌提出,主要用于搜索领域,解决海量数据计算问题. MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce( ...

  6. 大数据开发 | MapReduce介绍

    1.  MapReduce 介绍 1.1MapReduce的作用 假设有一个计算文件中单词个数的需求,文件比较多也比较大,在单击运行的时候机器的内存受限,磁盘受限,运算能力受限,而一旦将单机版程序扩展 ...

  7. Hadoop自学笔记(三)MapReduce简单介绍

    1. MapReduce Architecture MapReduce是一套可编程的框架,大部分MapReduce的工作都能够用Pig或者Hive完毕.可是还是要了解MapReduce本身是怎样工作的 ...

  8. Windows下Hadoop编程环境配置指南

    刘勇    Email: lyssym@sina.com 本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣! 简介 鉴于最近在研究 ...

  9. 后Hadoop时代的大数据架构

    提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年的历史了,很多东西发生了变化,版本也从0.x进化到目前的2.6版本.我把2012年后定义成后Hadoop平台时代,这不是说不 ...

随机推荐

  1. Max Sum Plus Plus——A

    A. Max Sum Plus Plus Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To ...

  2. Implement strStr()

    Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...

  3. oracle 连接查询,和(+)符号的用法

    --连接查询 左链接.右链接,全链接 --内链接select e.account 用户名, e.empname 名称, c.comname 公司名称  from employee e inner jo ...

  4. springMVC工作机制和框架搭建配置说明

    先说一下springMVC的工作机制 1.springmvc把 所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作. 2.Dispatcher ...

  5. lightetreeview

    http://www.16css.com/menu/905.html 其他树形菜单:很好--1.http://www.cnblogs.com/zhhh/archive/2011/11/25/22637 ...

  6. UIBezierPath 的使用

    使用UIBezierPath类可以创建基于矢量的路径,这个类在UIKit中.此类是Core Graphics框架关于path的一个封装.使用此类可以定义简单的形状,如椭圆或者矩形,或者有多个直线和曲线 ...

  7. 20145337《Java程序设计》第三周学习总结

    20145337 <Java程序设计>第三周学习总结 教材学习内容总结 类与对象 类与对象的关系:要产生对象必须先定义类,类是对象的设计图,对象是类的实例.我觉得在视频中对类与对象关系的描 ...

  8. el 表达式 和 ognl表达式

    el (expression language) el 基础操作符 el 能够隐含对象(就是可以直接访问的) el 的两种使用方式,第二种好像在jsp中没有什么用,主要用于jsf el能够访问的对象( ...

  9. SQL Server 存储过程(转)

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  10. JTA和JDBC事务

    一般情况下,J2EE应用服务器支持JDBC事务.JTA事务.容器管理事务.这里讨论JTA和JDBC事务的区别.这2个是常用的DAO模式事务界定方式.JDBC 事务 JDBC 事务是用 Connecti ...