- 大数据平台组件搭建。
要求在Hadoop集群上搭建1.6.3版本的Spark分布式集群。(提示如下,注意每一步骤的代码与结果需截图在报告中体现)
1.Spark安装包处理,解压到/usr/local目录下,在master节点通过命令“wget -P /opt http://datasrc.tipdm.net:81/bigdata/spark/software/spark-1.6.3-bin-hadoop2.6.tgz”进行获取。
2.Spark配置文件修改(spark-env.sh、slaves、spark-default.conf),配置要求为:以master为主节点,Spark Master端口号为7077,Worker使用计算资源为单核512m,Executor使用计算资源为单核512m,限制每台机器只能有一个worker,spark日志相关信息与事件日志的保存路径均设置为HDFS文件系统上的/spark-logs。
3.子节点同步。
4.创建spark-default.conf配置文件中指定的Spark日志存放目录。
5.修改环境变量,并使其生效。
6.确保Hadoop集群已开启。
7.启动Spark集群。
8.查看Spark监控界面,确认集群部署状态无误。
【答案】
(1)解压安装包到/usr/local下。
tar -zxf /opt/spark-1.6.3-bin-hadoop2.6.tgz -C /usr/local |
(2)进入/usr/local/spark-1.6.3-bin-hadoop2.6/conf。
cd /usr/local/spark-1.6.3-bin-hadoop2.6/conf |
(3)配置spark-env.sh文件,复制spark-env.sh.template文件,重命名为spark-env.sh。
cp spark-env.sh.template spark-env.sh # 在文件末尾配置如下内容: export JAVA_HOME=/usr/lib/jvm/java export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop/ export SPARK_MASTER_IP=master export SPARK_MASTER_PORT=7077 export SPARK_WORKER_MEMORY=512m export SPARK_WORKER_CORES=1 export SPARK_EXECUTOR_MEMORY=512m export SPARK_EXECUTOR_CORES=1 export SPARK_WORKER_INSTANCES=1 |
(4)配置slaves文件,复制slaves.template文件,重命名为slaves。
cp slaves.template slaves # 在文件中配置如下内容: slave1 slave2 |
(5)配置spark-defaults.conf文件,复制spark-defaults.conf.template文件,重命名为spark-defaults.conf。
cp spark-defaults.conf.template spark-defaults.conf # 在配置文件中添加如下内容: spark.master spark://master:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/spark-logs spark.history.fs.logDirectory hdfs://master:8020/spark-logs |
(6)将配置好的Spark目录同步到子节点。
scp -r /usr/local/spark-1.6.3-bin-hadoop2.6/ slave1:/usr/local scp -r /usr/local/spark-1.6.3-bin-hadoop2.6/ slave2:/usr/local |
(7)创建spark-logs目录
hdfs dfs -mkdir /spark-logs |
(8)修改环境变量,在各节点的/etc/profile下添加Spark对应路径。
export SPARK_HOME=/usr/local/spark-1.6.3-bin-hadoop2.6 export PATH=$PATH:$SPARK_HOME/bin |
运行“source /etc/profile”使配置生效。D
(9)jps检查三个节点是否已开启Hadoop集群,未开启则在master通过命令开启。
$HADOOP_HOME/sbin/start-all.sh |
(10)启动Spark集群
/usr/local/spark-1.6.3-bin-hadoop2.6/sbin/start-all.sh |
(11)在浏览器查看,检查能否正常监控,两个子节点状态是否与要求一致。
http://master:8080 |
- 编程学习网站题目爬取。
1.访问菜鸟教程(https://www.runoob.com),爬取其Python3实例模块的题目内容,要求输出格式如下图所示。
【答案】
import requests from lxml import etree import time # 获取题目链接 url = 'https://www.runoob.com/python3/python3-examples.html' web_data = requests.get(url) dom = etree.HTML(web_data.text, etree.HTMLParser(encoding='utf-8')) # 网页解析 exerciseList= dom.xpath('//div[@id="content"]/ul/li/a/text()') # 练习题名称 urlList= dom.xpath('//div[@id="content"]/ul/li/a/@href') # 练习题超链接 urlList = ['/python3/'+i if '/python3/' not in i else i for i in urlList ] urlList = ['https://www.runoob.com' + i if 'www.runoob.com/' not in i else 'https:'+i for i in urlList] exerciseString = '\n'.join(exerciseList) # 将练习题名称拼接成一个字符串 with open('exercisePython.txt', 'w') as f: f.write(exerciseString) #爬取题目数据及整理写出 resultList = [] for url in urlList: web_data = requests.get(url) dom = etree.HTML(web_data.text, etree.HTMLParser(encoding='utf-8')) # 网页源码解析 # 获取题目及答案 title = dom.xpath('string(//div[@id="content"]/h1)') # 练习题名称 content = dom.xpath('string(//div[@id="content"]/p[2])') # 练习题描述内容 code = dom.xpath('string(//div[@id="content"]//div[@class="example"]//div[@class="hl-main"])') # 练习题答案 result = dom.xpath('string(//div[@id="content"]/p[3])') # 结果描述 output = dom.xpath('string(//div[@id="content"]/pre)') # 目标输出 res = title + '\n' + content+ '\n' # 将内容进行拼接 resultList.append(res) time.sleep(1) print(url, '\n', res) mid = resultList.copy() for i in range(len(mid)): mid[i] = str(i+1)+'、'+ mid[i] # 加入题目序号 with open('Python编程基础上机题库1.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(mid)) # 将数据写出 |
三、电力数据分析与挖掘。数据data_etr.csv为用户用电量数据,数据中有编号为1-200的200位电力用户,DATA_DATE表示时间,如2015/1/1表示2015年1月1日,KWH为用电量。请完成以下工作:
(1) 将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。
(2) 对数据中的异常数据进行识别并处理。
(3) 统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。
(4) 每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。
(5) 求取每个用户的5%分位数。
(6) 每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同3。
(7) 统计每个用户的日用电量在其最大值0.9倍以上的次数。
(8) 求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,12个月每个月都有0,则看哪个月的0最多。
(9) 合并上述特征。
【答案】
# 1.将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。 import numpy as np import pandas as pd import os #将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。 data=pd.read_csv('data_etr.csv',parse_dates=['DATA_DATE'],encoding='gbk') data.head() #透视表 data_new=pd.pivot_table(data=data,values='KWH',index='CONS_NO',columns='DATA_DATE') # 2.对数据中的异常数据进行识别并处理。 def clear_(x=None): QL=x.quantile(0.25)#下四分位数 QU=x.quantile(0.75)#上四分位数 IQR=QU-QL x[((x>QU+1.5*IQR)|(x<QL-1.5*IQR))]=None return x data_new.apply(clear_,axis=0)#对每一行操作 # 3.统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。 feature1=data_new.T.agg(['max','min','mean','median','sum','var','skew','kurt'],axis=0).T # 4.每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。 feature2=data_new.T.diff(axis=1).agg(['max','min','mean','median','sum','var','skew','kurt'],axis=0).T # 5.求取每个用户的5%分位数。 feature3=data_new.quantile(0.05,axis=1) # 6.每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同3。 data_new.columns.week feature4=(data_new.T.resample('W').sum()).T.diff(axis=1).T.agg(['max','min','mean','median','sum','var','skew','kurt'],axis=0).T # 7.统计每个用户的日用电量在其最大值0.9倍以上的次数。 feature5=data_new.apply(lambda x:sum(x>x.max()*0.9),axis=1) # 8.求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,12个月每个月都有0,则看哪个月的0最多。 feature6=data_new.apply(lambda x: x==x.min(),axis=1).groupby(by=data_new.columns.month,axis=1).sum().idxmax(axis=1) #最小值 feature7=data_new.apply(lambda x: x==x.max(),axis=1).groupby(by=data_new.columns.month,axis=1).sum().idxmax(axis=1) #最大值 # 9.合并上述特征。 pd.concat([feature1,feature2,feature3,feature4,feature5,feature6,feature7],axis=0) |
四、股票数据可视化,完成以下问题:
1.文件读取及数据查看;
2.提取股票代号600000在2017年1月3日至2017年1月20日的收盘价格数据,并绘制股票价格走势图进行分析;
3.提取股票代号600000在2017年1月3日至2017年1月24日的交易量数据,并绘制交易量分布柱状图进行分析;
4.提取股票代号600000在2017年1月至11月的交易量统计数据,并绘制月交易量分布饼图进行分析;
5.绘制以上图形组成的3×1子图。
【答案】
- 文件读取及查看
import pandas as pd import numpy as np import matplotlib.pyplot as plt data=pd.read_excel('/data/trd.xlsx',engine="openpyxl") #查看列名和数据 print(data.columns) print(data.iloc[:5]) |
2. 提取股票代号600000在2017年1月3日至2017年1月20日的收盘价格数据,并绘制股票价格走势图
dt=data.loc[data['股票代码']==600000,['交易日期','收盘价','交易量']] I1=dt['交易日期'].values>='2017-01-03' I2=dt['交易日期'].values<='2017-01-20' dta=dt.iloc[I1&I2,:] y1=dta['收盘价'] x1=range(len(y1)) plt.figure(1) plt.plot(x1,y1) plt.xlabel(u' date ',fontproperties='SimHei') plt.ylabel(u' Closing_Price ',fontproperties='SimHei') plt.title(u' Closing_Price_State ',fontproperties='SimHei') plt.savefig('1.png') |
3. 提取股票代号600000在2017年1月3日至2017年1月24日的交易量数据,并绘制交易量分布柱状图
I3=dt['交易日期'].values>='2017-01-03' I4=dt['交易日期'].values<='2017-01-24' dta=dt.iloc[I3&I4,:] y2=dta['交易量'] x2=range(len(y2)) plt.figure(2) plt.bar(x2,y2) plt.xlabel(u' date ',fontproperties='SimHei') plt.ylabel(u' Volume ',fontproperties='SimHei') plt.title(u' Volume_State ',fontproperties='SimHei') plt.savefig('2.png') |
4. 提取股票代号600000在2017年1月至11月的交易量统计数据,并绘制月交易量分布饼图
list1=list() for m in range(11): m=m+1 if m<10: m1='2017-0'+str(m)+'-01' m2='2017-0'+str(m)+'-31' mon='0'+str(m) else: m1='2017-'+str(m)+'-01' m2='2017-'+str(m)+'-31' mon=str(m) I1=dt['交易日期'].values>=m1 I2=dt['交易日期'].values<=m2 D[m-1]=dt.iloc[I1&I2,[2]].sum()[0] list1.append(mon) plt.figure(3) plt.pie(D,labels=list1,autopct='%1.2f%%') # 保留小数点后两位 plt.title(u'Month_Volume_State',fontproperties='SimHei') plt.savefig('3.png') |
5. 绘制以上图形组成的3×1子图
plt.figure(4) plt.figure(figsize=(14,6)) plt.subplot(1,3,1) plt.plot(x1,y1) plt.xlabel(u' date ',fontproperties='SimHei') plt.ylabel(u' Closing_Price ',fontproperties='SimHei') plt.title(u' Closing_Price_State ',fontproperties='SimHei') plt.subplot(1,3,2) plt.bar(x2,y2) plt.xlabel(u' date ',fontproperties='SimHei') plt.ylabel(u' Volume ',fontproperties='SimHei') plt.title(u' Volume_State ',fontproperties='SimHei') plt.subplot(1,3,3) plt.pie(D,labels=list1,autopct='%1.2f%%') # 保留小数点后两位 plt.title(u' Month_Volume_State ',fontproperties='SimHei') plt.savefig('4.png') |