慢吞云雾缓吐愁 发表于 2024-7-14 07:59:34

基于地震数据的Spark数据处理与分析

1.标题要求

针对全球庞大地震数据进行分析,接纳Python为编程语言,接纳Hadoop存储数据,接纳Spark对数据进行处理分析,并对结果进行数据可视化。
2.需求分析

本项目将使用大数据分析引擎Spark对美国国家地震中央收集的汗青地震数据进行分析处理,为了保证研究的可行性,本文选取了1965年—2016年的全球庞大地震数据。该数据集记录了该时间段全天下所有震级5.5以上地震的发生时间、场景等详细信息。
数据处理:

   对美国国家地震中央1965-2016全球庞大地震数据集进行须要的数据处理,使用python语言编写代码,实现根据数据集发生地点的经纬度获取地震的发生地理位置信息。
数据分析:

   
[*]使用大数据引擎Spark对处理后的数据进行分析,统计以年、月、日为单位的地震发生次数。
[*]使用大数据引擎Spark对处理后的数据进行分析,统计中国境内每个省份(海疆)发生庞大地震的次数。
[*]使用大数据引擎Spark对处理后的数据进行分析,统计中国境内和天下范围内的不同地震类型的数目。
[*]使用大数据引擎Spark对处理后的数据进行分析,统计震级前500的地震次数。
[*]使用大数据引擎Spark对处理后的数据进行分析,统计震源深度前500的地震次数。
[*]使用大数据引擎Spark对处理后的数据进行分析,震级与震源深度的关系。
[*]将分析后的数据上传到Hadoop。
数据可视化:

       1.将所有分析后的数据绘制到带有坐标的地图上,并保存为html格式。
    2.对分析后的数据集分别选取符合的图表进行可视化(包括散点图、热力图、柱状图、词云等等),并保存为html格式文件方便查看。 
流程图:

https://img-blog.csdnimg.cn/direct/1f30c1bf9f8c4dc7b1b296f9c9c913f4.png
3.实行情况

官网给出的实行情况,虚拟机为hadoop单节点伪分布式:
https://img-blog.csdnimg.cn/direct/a0d8070a90d34ee1b4370051b2feecef.png
本实行接纳的虚拟机为厦门大学林子雨老师创建的虚拟机镜像,内里有配置好的实行情况,可以直接使用VMware创建此镜像的虚拟机,安装简单,步调如下。
下载镜像:

可以访问林子雨老师的公开百度云盘百度网盘 请输入提取码 (baidu.com)(提取码:jysh)进行下载,此镜像巨细是7.18G,下载时间较长,下载完成后保存到本地。
https://img-blog.csdnimg.cn/direct/5375857982234111a9ad1263625e5833.png
如有须要可以访问林子雨老师官方网站进行查看步调:
大数据Linux实行情况虚拟机镜像文件_厦大数据库实行室博客 (xmu.edu.cn)
安装虚拟机:

详细步调可以查看此篇教程:VMware导入ova/ovf虚拟机文件_vmware ova-CSDN博客
按图片步调进行安装:
在VMware里选择打开虚拟机文件:
https://img-blog.csdnimg.cn/direct/f6494e4a4fb04970883ca9d0618f5019.png
选择虚拟机文件
https://img-blog.csdnimg.cn/direct/c940bbca861a480dbf486bb512495550.png
设置名称和安装路径:
https://img-blog.csdnimg.cn/direct/3a685e2867b14104804a9d56b27154fd.png
安装完成后打开虚拟机,进入hadoop用户,默认暗码为hadoop,升级root用户暗码也是hadoop。
https://img-blog.csdnimg.cn/direct/f4b1893c9e574013932936615aed0023.png
https://img-blog.csdnimg.cn/direct/a74c80e13ef442f89f1589f54bea5f82.png
内部情况:

我使用的python版本为3.7版本,在进行情况配置时发现,该版本与spark 1.8和spark 2.1是不兼容的,而此虚拟机的spark是1.6版本,于是对spark进行升级,以下是各版本兼容表。
Linux
Hadoop
Spark
Python
是否兼容
Ubuntu 16.4
Hadoop 2.7
Spark 1.8
Python 3.7(anaconda)
不兼容
Ubuntu 16.4
Hadoop 2.7
Spark 2.1
Python 3.7(anaconda)
不兼容
Ubuntu 16.4
Hadoop 2.7
Spark 2.4
Python 3.7(anaconda)
兼容
终极接纳的配置如下:
Ubuntu 16.4 + Hadoop 2.7 + Spark 2.4 + Python 3.7 (Ananconda)
https://img-blog.csdnimg.cn/direct/5b5da2f793c247378867e0079c7a113c.png
安装plotly用于绘制地图,安装wordcloud用于绘制词云图。
conda install plotly
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple wordcloud 4.数据预处理

下载数据:

earthquake.csv有23412条地震数据,下载百度网盘地点为:百度网盘 请输入提取码 提取码: 2hza
上传数据:

可以直接拖动已下载的csv文件到ubuntu内,也可以通过xftp进行远程连接上传。
创建jupyter notebook:

使用以下下令新建一个jupyter开发情况并设置暗码:
jupyter notebook --generate -config

jupyter notebook password # 按提示,输入密码,确认密码 然后在终端输入jupyter notebook,背景启动lupyterhttps://img-blog.csdnimg.cn/direct/26b14a94b44d4435b375570c73194eb8.png
在欣赏器中输入程序运行的网址进入jupyter,并输入之前设置的暗码。
https://img-blog.csdnimg.cn/direct/f5dae30effb54c88a4122b3a95c484ed.png
读取数据: 

import pandas as pd
import numpy as np

data = pd.read_csv('~/jupyternotebook/bigdataProject/earthquake.csv')
data.head(10) 洗濯数据:

查看全数据信息
​data.describe()
查看有无重复值
data.duplicated().sum() 查看各列的底子信息
data.info()
https://img-blog.csdnimg.cn/direct/2a1a665be1b64f928011f386cd79b51b.png
此中‘Date’、‘Time’属性均为object,故数据洗濯分为两部门:‘Date’属性洗濯和‘Time’属性洗濯。 
‘Date’列:
   首先,我们使用pandas内置函数to_datetime () 来对原‘Date’列进行格式的转换。此中format用于将年、月、日分别映射到原数据的年、月、日;errors用来设置错误情况,‘coerce’参数意味着当出现格式无法进行转换的时候,会将其值记为‘NaT’。我们创建了一个‘Structed Date’属性来存放转换后的‘Date’值。然后通过isnull () 函数来查看转换后的数据,可以发现有3行转换出现错误,分别是378、7512、20650行。为了修正这三行,我们须要用loc () 函数手动定位到这三行,然后进行数据的修改。末了,将本来的‘Date’列删除。
https://img-blog.csdnimg.cn/direct/a48bb904e7a44199a3cd4c950c3b3e1e.png
 ‘Time’列:
   首先,我们使用pandas内置函数to_datetime () 来对原‘Time’列进行格式的转换。此中format用于将时、分、秒分别映射到原数据的时、分、秒;errors用来设置错误情况,‘coerce’参数意味着当出现格式无法进行转换的时候,会将其值记为‘NaT’。‘Structed Time’属性来存放转换后的‘Time’值。然后通过isnull () 来查看转换后的数据,可以发现有3行转换出现错误,分别是378、7512、20650行。使用loc () 手动定位到这三行,然后进行数据的修改。末了,将本来的‘Time’列删除。
https://img-blog.csdnimg.cn/direct/7f46fb881907422a944779f3e2c95812.png
5.根据经纬度获取地名 

我们首先调用高德的逆地点分析API,根据地震发生的经纬度进行确定在哪个区域发生的地震。
高德API服务:

(1) 首先注册成为开发者
https://img-blog.csdnimg.cn/direct/6c326480f46648a89534c5a60d30fada.png
(2) 创建API的key用于调用逆地点分析
https://img-blog.csdnimg.cn/direct/04e349aad062422b8ace0181c5d79077.png
https://img-blog.csdnimg.cn/direct/e216911b12e34a1597caf73d1546115f.png(3) 传入参数解读
https://img-blog.csdnimg.cn/direct/86534ea09ef047afa2f9f4755fa32988.png
(4) 根据已创建的key,使用request请求进行调用API,传入所有地震发生的经纬度获取区域名称并提取。根据自定义的函数getProvince () 为每个经纬度坐标获取位置信息,大概须要花费十分钟左右的时间。
https://img-blog.csdnimg.cn/direct/03e7090ed0dd4fa4b3e4a5d8ac7c6ccf.png
结果如上图,使用unique () 函数对结果查看。可以发现这个API对于中国境内海疆和境外的坐标不能正确地返回结果。坐标在中国境内海疆时,返回的结果是‘中人民共和国’;坐标在中国境外时,就返回一个空值。
https://img-blog.csdnimg.cn/direct/0047c28153a140cf8acd3b5514e84901.png
查看data数据,可以看到很多境外的坐标调用结果都是NaN。对于提取有误的结果,我们换腾讯API服务网站进行结果调用。
腾讯API服务:

(1) 对国内地震区域名称进行提取
首先将request的查询结果转换为json类型(以北京为例)。
https://img-blog.csdnimg.cn/direct/1c4fe77873c14de8912c089369a01ac7.png
https://img-blog.csdnimg.cn/direct/fafec46aba8744659a812dc07073502e.png
可以看出我想要的区域省份名称在’regeocode’下的’addressComponent’里的’province’,所以我们对查询结果进行一级一级的提取,终极得到地震发生的区域名称。
https://img-blog.csdnimg.cn/direct/96bedbe2cefd4a65a0f0c0409e47cc3e.png
(2) 对中国地震区域名称提取
高德地图的定位会过于笼统,有些中国区域内的偏僻地域省份以及海疆的经纬度识别不出来,而且会发生数据丢失的情况,我们用腾讯API对中国地震区域名称进行提取,腾讯的逆地点API的调用与高德一致,都是通过一个key来调用查询。
对比分析(同一经纬度35.206,115.213):
1)调用高德查询
https://img-blog.csdnimg.cn/direct/4b42fc234027462abc320e7466de7d13.png
分析以上的报错原因
https://img-blog.csdnimg.cn/direct/4fea4e052e59426988abf4a4f5036905.png
2)调用腾讯查询
https://img-blog.csdnimg.cn/direct/793826adcb5f4633860c3649599861fb.png
可见同样的经纬度,在调用腾讯API时可以识别出正确省份,而高德API识别不出。
下面对于调用高德API没有识别出的海洋区域,使用腾讯API进行提取。对海洋区域查询结果进行测试:
https://img-blog.csdnimg.cn/direct/11315126ac904ad0a32674b10fcb509d.png
https://img-blog.csdnimg.cn/direct/c700f49578fa4c6f8217e5178562c68d.png
可以看出海疆名称在 ’result’ 下的 ’address_reference’ 下的 ’ocean’ 下的 ’title’ 里,对中国地震海疆名称进行提取: 
https://img-blog.csdnimg.cn/direct/43d620eca1b4437caad1424309f12a11.png
https://img-blog.csdnimg.cn/direct/f8a02b7dc2eb4af99bef9fe13b3c3554.png
将提取的海疆数据与原数据合并:
https://img-blog.csdnimg.cn/direct/235b0cbfe264450d8b7b3368ef7e9d0b.png
终极得到了中国境内的地震区域名称:
https://img-blog.csdnimg.cn/direct/a2220060fbbb4d1c9d565a32f6233498.png
(3) 提取天下范围以国家为单位的发生地震区域名称
https://img-blog.csdnimg.cn/direct/bd0398a47d6045698221d15e946a1391.png
https://img-blog.csdnimg.cn/direct/b4d5e432a0ef46aeb88f259b97c7c2ce.png
getProvince () 函数来根据调用API服务网站实现该功能。
部门参数的定义ul:API服务网站(这里我们使用了高德API和腾讯API两种服务进行对比);key:API服务网站的暗码(由网站定义);location:自定义的位置信息字符串。
然后通过requests的函数get () 调用谁人网页获取位置信息,并将结果转化为json格式。由于网站给出的信息内容很多,我们只须要此中省份这一部门,所以对查询结果先判断是否为中国区域,如果是则进行下一步详细省份提取,终极返回所须要的信息。
import requests
import json

def getProvince(lon, lat):
    u1 = 'http://restapi.amap.com/v3/geocode/regeo?output=json&'
    key = '&key=23fae2edfcbf868f4c202dcd7346f32e'
    location = 'location=' + str(lon) + ','+ str(lat)
    url = u1 + location + key
    res = requests.get(url)
    json_data = json.loads(res.text)
    regeoinfo = json_data['regeocode']['addressComponent']
   
    if 'country' in regeoinfo and regeoinfo['country'] == '中国':
      if 'province' in regeoinfo and regeoinfo['province']:
            return regeoinfo['province']
      elif 'seaArea' in regeoinfo and regeoinfo['seaArea']:
            return regeoinfo['seaArea']
   
    return None  6.上传数据

数据洗濯工作完成之后,还须要对数据上传到Hadoop。通过to_csv () 函数将数据保存到文件earthquake_cleaned.csv中,编码设为utf-8,防止spark读取的时候出现中文乱码。
rawData.to_csv("earthquake_clean.csv",
               encoding='utf-8',
               index=False) (1) 启动Hadoop
查看各组件状态
https://img-blog.csdnimg.cn/direct/f7f19b57117d4f93b4560c2b4fb353b7.png
 (2) 上传到HDFS
https://img-blog.csdnimg.cn/direct/8e9ea9d7149f4c309b5c10a28e35b4b9.png
https://img-blog.csdnimg.cn/direct/9673e5cff16843ae97de664db6a5c36b.png
7.Spark数据分析 

(1) 读取数据
从HDFS中读取处理后的文件:
https://img-blog.csdnimg.cn/direct/1c8bd136bbde481aa92a4af973f7da62.png
   体现数据部门行后发现Spark读取csv文件时将Date列读取成了‘1965-01-02 00:00:00’的格式,因此还须要进一步对数据进行处理。对‘Date’属性进行拆分,丢掉背面00:00:00的部门。使用split () 函数根据空格对‘Date’属性进行拆分,我们只须要第一部门的数据,故对其使用索引值切片得到所需的部门。withColumn () 是 spark 中常用的 API,可以用于添加新字段 / 字段重命名 / 修改字段类型,这里我们用来添加新字段。withColumnRenamed () 用来对字段进行重命名。
https://img-blog.csdnimg.cn/direct/18486fb66b304356b424a2101fe4d9a3.png (2) 添加年、月、日列
为了分别以年、月、日为时间粒度统计全球地震数据,我们将‘Date’属性分为‘Year'、‘Month’、
‘Day’,三个属性,并添加到数据表中
https://img-blog.csdnimg.cn/direct/fd85af043f9b427b80877d211095d10a.png
由于切分后的数据类型为字符串型,我们须要将其进行格式转换。通过 for 循环遍历 attrsName 列表中的每个属性名,将 DataFrame 中对应的列通过Spark的withColumn () 函数重新赋值,并使用cast () 将其转换为整数类型。
https://img-blog.csdnimg.cn/direct/943b97366b414b18b0f43879a28a9f65.png
  (3) 统计各年、月、日庞大地震的次数
   转换格式后,我们对数据分别以年、月、日地震数据进行统计。如下图,通过常见函数groupBy () 对数据的‘year’属性进行分组,并通过count () 函数分别对每个组进行统计,末了用orderBy () 函数对统计结果进行排序。统计完成之后,将数据存入countByYear.csv”文件。年、月、日的统计过程一致。将结果保存到文件中,方便之后进行可视化。由于使用Spark自带的函数将DataFrame保存为csv文件时,文件会保存为文件夹,在本地读取时比较麻烦。因此使用toPandas()方法将Spark的DataFrame转换成pandas的DataFrame,再保存为csv文件,方便可视化时读取。这里展示了以年为例的代码部门。
https://img-blog.csdnimg.cn/direct/4e67eaf68df74d20aa94158fcd702555.png

https://img-blog.csdnimg.cn/direct/292b1aaf1bad425db7e85e17264b7b1a.png
 (4) 统计中国各省份(海疆)发生庞大地震的次数
https://img-blog.csdnimg.cn/direct/abc8fd90a639480cb47660fdd1b7b942.png
(5) 统计不同类型地震的数目
https://img-blog.csdnimg.cn/direct/9125cd692e6e4e91b22166416c4a17f5.png
(6) 统计震级前500的地震
https://img-blog.csdnimg.cn/direct/3218e14b72464f20b400b28bcb372580.png
(7) 统计震源深度前500的地震
https://img-blog.csdnimg.cn/direct/6746765b3ef74b1496a95810e730b79e.png
(8) 统计震级与震源深度的关系
https://img-blog.csdnimg.cn/direct/13e0572d467b4c0a8ef6818c1783ebbd.png
上述是我针对中国境内数据进行的统计,另有针对全天下的数据进行统计,这里不再给出。以下是我统计得到的所有文件,根据这些文件进行数据可视化
https://img-blog.csdnimg.cn/direct/1159c4972e81489fb8ad11e69d4e70d9.png
8.数据可视化

我从中国境内、天下范围、全球总体三个方面进行数据分析与可视化。,用到的可视化库有plotly和pyecharts。
(1) 中国境内地震数据可视化

      https://img-blog.csdnimg.cn/direct/345b2dd0ad0340918c250e8e9b1a1949.png       中国区域总体地震分布地图      
      https://img-blog.csdnimg.cn/direct/836568fd51a84b0e80d5d982f86f2587.png       中国各省份(海疆)发生庞大地震的次数            https://img-blog.csdnimg.cn/direct/abeb51cbb55245d18f75a6d48162ded2.png       中国区域内各省份地震次数分布(省级地图)            https://img-blog.csdnimg.cn/direct/1bffe66fd4ed4d7db39cde3996a41c96.png       中国区域内各省份地震次数分布(词云图)         https://img-blog.csdnimg.cn/direct/5be58300dcd744efae018da580e1f362.png   中国各省份(海疆)发生庞大地震的震级分布柱状图         https://img-blog.csdnimg.cn/direct/140c66e4bcf64aa79c91035b3e130b52.png       中国区域内各省份地震类型分布占比图            https://img-blog.csdnimg.cn/direct/8f7dff1d2e1e413ebd195a55528b2719.png       中国区域内地震震源热力图(符合地震带分布)       将我绘制的热力图与中国强震及地震带分布图对比:
https://img-blog.csdnimg.cn/direct/4df36268e2d14df49f28e841fd74efd6.png (2) 天下范围地震数据可视化

   https://img-blog.csdnimg.cn/direct/bd03a7742b224e1ca681bd01d87b8726.png   天下区域内总体地震分布图      https://img-blog.csdnimg.cn/direct/267912a027384584876e2b1465b63ad5.png   天下区域内各国家地震次数分布柱状图      https://img-blog.csdnimg.cn/direct/00c6deb0b28a4d868c34b7b2ed042d35.png   天下区域内各国家地震次数分布词云图   
   https://img-blog.csdnimg.cn/direct/f04e6d6a7d184677bce18389515f1845.png   天下区域内各国家地震类型分布占比图         https://img-blog.csdnimg.cn/direct/41952b7a26eb48febfc33ef36b8c71e3.png       天下区域震源热力图        将我绘制的热力图与全球地震带分布图对比:https://img-blog.csdnimg.cn/direct/53afc23885e245b69650dba6755fadd7.png
 (3) 全球总体地震数据可视化

      https://img-blog.csdnimg.cn/direct/fef6d17a8ca149d8804f8fb2012d272c.png       震级前500庞大地震天下区域分布         https://img-blog.csdnimg.cn/direct/641fb5e131d24c7590c2a97b9c83d553.png   震源深度前500庞大地震天下区域分布   
   https://img-blog.csdnimg.cn/direct/bd4d031d067d426abf89bf286c66a4c0.png   震级与震源深度关系散点图      https://img-blog.csdnimg.cn/direct/ffb64e6816474224ab213f09d25e9941.png   天下范围内庞大地震次数年变化柱状图      https://img-blog.csdnimg.cn/direct/1ad0caa195c241259ef2d38b85e69bb2.png   天下范围内庞大地震次数年变化折线图      https://img-blog.csdnimg.cn/direct/bc836c29d2eb41f8bdcd01172c76a26c.png   天下范围内庞大地震次数年变化地图(动态结果)      https://img-blog.csdnimg.cn/direct/3979def19ae84b978c6e8a0890cfa4c0.png   天下范围内庞大地震次数月变化柱状图      https://img-blog.csdnimg.cn/direct/e3836234be7b490b99d7797822c58eb1.png   天下范围内庞大地震次数月变化折线图   
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于地震数据的Spark数据处理与分析