本文介绍通过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. 在springmvc中,获取Connection接口

    ServletContext context = request.getSession().getServletContext();WebApplicationContext wac = WebApp ...

  2. 记录load data infile 的用法

    load data local infile 'd:/1.txt' into table tcm.wm_dis_category fields terminated by';' lines termi ...

  3. json 输出中文乱码解决办法

    echo json_decode(json_encode("修改成功")); 这样就行了

  4. 关于viewpoint的疑惑

    问题: 为什么在手机上打开一个PC web页面,用手机打开一个宽度为980的固定布局页面,页面会默认缩放到刚好满屏显示,并不会出现横向滚动条? 一:设备像素和CSS像素区别 现代浏览器中实现缩放的方式 ...

  5. Java面试题大全(三)

    81.如何设定的weblogic的热启动模式(开发模式)与产品发布模式? 可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一.或者修改服务的启动文件或者commenv文件,增加set PR ...

  6. 关于WebDAV带来的网站潜在安全问题的疑问

    WebDAV:分布式创作和版本控制协议 (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1 ...

  7. 关于struts2上传图片临时文件

  8. Final-阶段站立会议5

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  9. DataSet, BindingSource, BindingNavigator Relationship

    Multiple Bindings caused dataBing weird???? Text.DataBindings.Add(new Binding("Text", bs1, ...

  10. 一步一步来做WebQQ机器人-(三)(登录QQ并保持在线)

    × 本篇的目的是让你的QQ真正的上线:挤下你的PCQQ,和让好友状态栏显示webqq在线 目前总进度大概50% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在 ...