一. 原始气象数据集下载:
如果我们想获取更多的气象原始数据集时,我们可以通过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
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
get_ncdc(sys.argv[1], sys.argv[2], sys.argv[3])
二. 气象数据预处理
鉴于Hadoop对于少量大文件处理较为高效,因此,我们可用将多个小文件合并为一个大文件,然后再把该文件上传到HDFS。如下我提供一个python程序,用于将如上获得的数据集合并为一个文件。
首先说用法:python3
待合并的小文件的父目录1 输出的gz文件路径1
待合并的小文件的父目录2 输出的gz文件路径2
1
2
例如文件内容为:
D:\NCDC\1901 D:\NCDC\1901.gz
1
会将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
''')
read_file(sys.argv[1])
原文:https://blog.csdn.net/m0_37367424/article/details/84875683