NCDC数据集准备

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

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

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

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

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

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

  • 打开ftp终端
    在这里插入图片描述
  • 连接FTP服务器,使用匿名登录,账户名为:anonymous,密码随便输,回车即可(如果此步输入错误,可输出user命令重新输入用户名密码)
open ftp.ncdc.noaa.gov

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

2. 通过脚本获取

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

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 <start_year> <end_year> <output_path>\n')
    get_ncdc(sys.argv[1], sys.argv[2], sys.argv[3])

二. 气象数据预处理

鉴于Hadoop对于少量大文件处理较为高效,因此,我们可用将多个小文件合并为一个大文件,然后再把该文件上传到HDFS。如下我提供一个python程序,用于将如上获得的数据集合并为一个文件。
首先说用法:python3 <python文件> <配置文件>,其中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 <config_file_abs_path>
        
        <config_file_abs_path> format: 
            <wait_parent_dir> <output_file_path>
            <wait_parent_dir>: The parent directory of the file to be merged. Must be an absolute path.
            <output_file_path>: Output file name. Must be an absolute path
        ''')
    read_file(sys.argv[1])

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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值