NCDC数据集准备

系列博客目录链接:Hadoop权威指南学习笔记:总章

可用数据集下载:
需要已经处理好的数据集的可点击如下链接去下载:

  • 气象数据
  • 气象站元数据

一. 原始气象数据集下载:

如果我们想获取更多的气象原始数据集时,我们可以通过NCDC的ftp服务器获取数据,实例如下

NCDC FTP数据服务器:ftp.ncdc.noaa.gov
NCDC 原始文件路径:pub/data/noaa/

1. 使用FTP终端获取NCDC数据集

  • 打开ftp终端
    NCDC数据集准备_第1张图片
  • 连接FTP服务器,使用匿名登录,账户名为:anonymous,密码随便输,回车即可(如果此步输入错误,可输出user命令重新输入用户名密码)
open ftp.ncdc.noaa.gov

NCDC数据集准备_第2张图片

  • 进入数据目录,关闭交互模式
cd pub/data/noaa/
prompt off
  • 选择要下载的日期,通过mget下载,以下载1901年数据为例(假设下载到本地D:\NCDC目录)
lcd D:\NCDC
mget 1901

NCDC数据集准备_第3张图片
NCDC数据集准备_第4张图片

2. 通过脚本获取

以下提供一个python3脚本,用于方便获取指定年份的数据到指定文件夹。使用方法为:
python3 get_ncdc.py

import sys
import os
from ftplib import FTP


def get_ncdc(start_year, end_year, output_path):
    ftp = FTP()
    ftp.connect('ftp.ncdc.noaa.gov')
    # 匿名登录
    ftp.login()
    # 进入数据目录
    data_path = '/pub/data/noaa/'
    ftp.cwd(data_path)
    if not os.path.exists(output_path):
        raise NotADirectoryError(output_path)
    while start_year <= end_year:
        local_parent_path = os.path.join(output_path, start_year)
        if not os.path.exists(local_parent_path):
            os.mkdir(local_parent_path)
        try:
            li = ftp.nlst(start_year)
        except Exception:
            print('Year %s not found! Skip it' % start_year)
            continue
        for eachFile in li:
            file_name = eachFile.split('/')[1]
            local_file_path = os.path.join(local_parent_path, file_name)
            print('Remote: %s ----> Local: %s' % (os.path.join(data_path, eachFile), local_file_path))
            bufsize = 1024  # 设置缓冲块大小
            fp = open(local_file_path, 'wb')  # 以写模式在本地打开文件
            ftp.retrbinary('RETR ' + eachFile, fp.write, bufsize)  # 接收服务器上文件并写入本地文件
        start_year = str(int(start_year) + 1)
    ftp.close()


if __name__ == '__main__':
    if len(sys.argv) < 4:
        raise Exception('[Usage]: python3 get_ncdc.py   \n')
    get_ncdc(sys.argv[1], sys.argv[2], sys.argv[3])

二. 气象数据预处理

鉴于Hadoop对于少量大文件处理较为高效,因此,我们可用将多个小文件合并为一个大文件,然后再把该文件上传到HDFS。如下我提供一个python程序,用于将如上获得的数据集合并为一个文件。
首先说用法:python3 <配置文件>,其中python文件指的是如下python代码,配置文件指向配置文件路径,必须为绝对路径,其内部所包含的所有路径也必须为绝对路径。配置文件格式如下:

待合并的小文件的父目录1 输出的gz文件路径1
待合并的小文件的父目录2 输出的gz文件路径2

例如文件内容为:

D:\NCDC\1901 D:\NCDC\1901.gz

会将D:\NCDC\1901下的所有小文件合并到D:\NCDC\1901.gz

python3代码:

# /bin/python3
import sys
import os
import gzip

"""
将气象数据合并为一个文件,然后发送至HDFS指定位置
"""
def ncdc_map(directory, output_file):
    if not os.path.isdir(directory):
        raise NotADirectoryError(directory)
    if os.path.exists(output_file):
        raise FileExistsError(output_file)
    with gzip.open(output_file, 'wb') as out_f:
        for file in os.listdir(directory):
            file_path = os.path.join(directory, file)
            with gzip.open(file_path, 'rb') as in_f:
                out_f.write(in_f.read())
    print(directory + '  --->  ' + output_file)


def read_file(config_path):
    for i in open(config_path):
        directory, output_file = i.split()
        ncdc_map(directory, output_file)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        raise Exception('''
        [Usage]:
            python3 ncdc_mapper.py 
        
         format: 
             
            : The parent directory of the file to be merged. Must be an absolute path.
            : Output file name. Must be an absolute path
        ''')
    read_file(sys.argv[1])

至此,数据集准备完毕。气象站数据暂待补充。

你可能感兴趣的:(hadoop权威指南学习笔记)