Hadoop: The Definitive Guide(Hadoop权威指南)Unix Tools 脚本编程实施

Example 2-2. A program for finding the maximum recorded temperature by year from NCDC weather records

#!/usr/bin/env bash

for year in all/*

do

  echo -ne `basename $year .gz`"\t"

  gunzip -c $year | \

    awk '{ temp = substr($0, 88, 5) + 0;

           q = substr($0, 93, 1);

           if (temp !=9999 && q ~ /[01459]/ && temp > max) max = temp }

         END { print max }'

done

 

使用linux脚本打印每年最高温度,先解释一下该脚本几个注意点。

脚本目的是发现每年的最高温度,第一句for year in 后的all/*表示在名称为all的文件夹下每年度的温度信息都以 1990.gz 方式存在。使用gunzip方式解压并打印,对打印的内容使用awk函数进行处理,获取最大温度,单个文件处理完毕后打印max

 

在上一篇中获取的数据包是这样,年度为文件夹,当中包含若干个温度详情文件。

E:\testData\1990\010010-9999-1990.gz

E:\testData\1990\010014-9999-1990.gz

E:\testData\1990\010015-9999-1990.gz

E:\testData\1990\010016-9999-1990.gz

 

从后面Appendix C的描述中得知,实际上作者对这样的数据进行了处理,因为hadoop在处理大量的小文件时无法达到很高的效率,因此作者使用hadoop将小文件合并,并且给出了代码。

 

我比较希望能够使用脚本处理,将所有的gz解压之后,合并成为一个文件,打包成gz的格式,这样就能完全符合之前那段脚本的处理方式。所以,脚本如下:

packyear

#! /bin/sh

# /usr/data/packyear

 

# unzip all gz files in data

for yeards in data/*

do

       # unzip all gz files in year directory

       for gzfile in $yeards/*

       do

              gunzip $gzfile

       done

      

       # cat all content to year file

       cat $yeards/* | head -2 >> $yeards.tc

 

       # remove year directory

       rm -rf $yeards

       mv $yeards.tc $yeards

 

       # zip the tc file

       gzip $yeards

done

 

根据实际路径改写的计算最大温度的脚本

maxyear

#! /bin/sh

# /usr/data/ maxyear

 

for year in /usr/data/*

do

  basename $year .gz

  gunzip -c $year | \

    awk '{temp=substr($0, 88, 5)+0;

        q=substr($0, 93, 1);

        if(temp !=9999 && q ~ /[01459]/ && temp > max) max = temp}

      END {print max}'

done

这个脚本最终显示出来会是:

1990

3

这样的格式。由于对数据结构的不熟悉,所以不确定显示出来的数据是否正确,但是基本的脚本和数据操作方式就是这样了。

你可能感兴趣的:(Hadoop: The Definitive Guide(Hadoop权威指南)Unix Tools 脚本编程实施)