Spark on Yarn安装
一、安装Scala
1.把Scala的jar包上传到master的目录下,创建工作路径并解压Scala到工作路径下
mkdir -p /usr/scala/
tar -zxvf scala-2.11.12.tgz -C /usr/scala/
等待执行完毕
2.配置环境变量(三台虚拟机)
vi /etc/profile
添加
#set scala
export SCALA_HOME=/usr/scala/scala-2.11.12
export PATH=
S
C
A
L
A
H
O
M
E
/
b
i
n
:
SCALA_HOME/bin:
SCALAHOME/bin:PATH
source /etc/profile
3.查看是否安装成功
scala -version
4.复制 scala 到子节点
scp -r /usr/scala root@slave1:/usr/
scp -r /usr/scala root@slave2:/usr/
5.分别切换 slave1 和 slave2 节点,检测 scala 环境是否安装成功
scala -version
二、安装Spark
1.把spark的jar包上传到master的目录下,创建工作路径并解压spark到工作路径下
mkdir -p /usr/spark/
tar -zxvf spark-2.4.0-bin-hadoop2.7.tgz -C /usr/spark/
2.编辑spark-env.sh
cd /usr/spark/spark-2.4.0-bin-hadoop2.7/conf
cp spark-env.sh.template spark-env.sh
vi spark-env.sh
添加
export SPARK_MASTER_IP=master
export SCALA_HOME=/usr/scala/scala-2.11.12
export SPARK_WORKER_MEMORY=8g
export JAVA_HOME=/usr/java/jdk1.8.0_171
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HADOOP_CONF_DIR=/usr/hadoop/hadoop-2.7.3/etc/Hadoop
3.配置spark从节点,修改slaves文件
cp slaves.template slaves
vi slaves
修改最后一行
slave1
slave2
4.配置环境变量(三台虚拟机)
vi /etc/profile
添加
export SPARK_HOME=/usr/spark/spark-2.4.0-bin-hadoop2.7
export PATH=
S
P
A
R
K
H
O
M
E
/
b
i
n
:
SPARK_HOME/bin:
SPARKHOME/bin:PATH
然后
source /etc/profile
5.分发子节点
scp -r /usr/spark root@slave1:/usr/
scp -r /usr/spark root@slave2:/usr/
6.测试运行环境(只在master节点执行)
开启Hadoop
/usr/hadoop/hadoop-2.7.3/sbin/start-all.sh
开启spark集群
/usr/spark/spark-2.4.0-bin-hadoop2.7/sbin/start-all.sh
7.三个节点分别输入jps查看进程
jps
三个节点分别出现以下标志即成功
8.访问spark web界面
浏览器输入
master节点IP:8080
出现以下界面即成功
9.开启spark-shell
spark-shell
可输入命令测试
println(“Hello world”)
10.输入pyspark测试python环境spark交互模式
pyspark
输入quit()可退出
数仓部署详解
一hbase安装
1.1解压缩
1.将hbase安装包传至根目录,建立工作路径/usr/hbase,将根目录下的 hbase 解压到工作路径中。
mkdir /usr/hbase
tar -zxvf hbase-1.2.4-bin.tar.gz -C /usr/hbase
1.2修改配置文件
2.进入hbase的conf目录下,修改配置文件hbase-env.sh
cd /usr/hbase/hbase-1.2.4/conf
vi hbase-env.sh
修改以下内容
在第21行添加
export HBASE_MANAGES_ZK=false
在第28行添加
export JAVA_HOME=/usr/java/jdk1.8.0_171
在第30行修改
export HBASE_CLASSPATH=/usr/hadoop/hadoop-2.7.3/etc/Hadoop
3.配置 hbase-site.xml
vi hbase-site.xml
添加内容到23行左右
hbase.rootdir
hdfs://master:9000/hbase
hbase.cluster.distributed
true
hbase.master
hdfs://master:6000
hbase.zookeeper.quorum
master,slave1,slave2
hbase.zookeeper.property.dataDir
/usr/zookeeper/zookeeper-3.4.10
4.配置 regionservers
在这里列出了希望运行的全部 HRegionServer,一行写一个 host。列在这里
的 server 会随着集群的启动而启动,集群的停止而停止
vi regionservers
5.hadoop 配置文件拷入 hbase 的 conf 目录下:(当前位置为 hbased 的conf 配置文件夹)
cp /usr/hadoop/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
cp /usr/hadoop/hadoop-2.7.3/etc/hadoop/core-site.xml
1.3.分发 hbase
6.分发 hbase
scp -r /usr/hbase root@slave1:/usr/
scp -r /usr/hbase root@slave2:/usr/
等待执行完毕~
1.4.配置环境变量
7.配置环境变量
vi /etc/profile
在第64行添加以下内容
set hbase environment
export HBASE_HOME=/usr/hbase/hbase-1.2.4
export PATH=
P
A
T
H
:
PATH:
PATH:HBASE_HOME/bin
生效环境变量
source /etc/profile
1.5.运行和测试
8.运行和测试
开启hadoop(master上执行)
cd /usr/hadoop/hadoop-2.7.3/
sbin/start-all.sh
开启zookeeper(每台虚拟机都执行)
cd /usr/zookeeper/zookeeper-3.4.10/
bin/zkServer.sh start
再在 master 上执行:
cd /usr/hbase/hbase-1.2.4/
bin/start-hbase.sh
再在3台虚拟机分别执行
jps
出现下图中框起来的内容,恭喜你~hbase搭建成功!
9.访问 master 的 hbase web 界面
http://master IP:16010/master-status
10.查看hbase版本
hbase shell
status
version
二数仓搭建(远程模式)MySQL和hive的安装
- 远程部署
2.安装MySQL
slave2 上安装 mysql server
2.1前提:修改本地源
yum -y install epel-release(如果安装了epel源就不修改)
怎么查看是否安装了epel源?
执行yum repolist,如果出现下图,不修改本地源。
没有出现的话,执行yum -y install epel-release
2.2下载MySQL
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
安装源
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
查看是否有包:
mysql-community.repo
mysql-community-source.repo
cd /etc/yum.repos.d
ls或ll
安装包
yum -y install mysql-community-server
等待安装完毕…
2.3启动服务
重载所有修改过的配置文件:
systemctl daemon-reload
开启服务:
systemctl start mysqld
开机自启:
systemctl enable mysqld
2.4设置密码
1.安装完毕后,/var/log/mysqld.log 文件中会自动生成一个随机的密码,我们需要先取得这个随机密码,以用于登录 MySQL 服务端:
grep “temporary password” /var/log/mysqld.log
mysql -uroot -p
2.MySQL 密码安全策略:
设置密码强度为低级:
set global validate_password_policy=0;
设置密码长度最低为4:
set global validate_password_length=4;
修改本地密码:
alter user ‘root’@‘localhost’ identified by ‘123456’;
退出:\q
2.5远程登录
以新密码登陆 MySQL:
mysql -uroot -p123456
创建用户:
create user ‘root’@’%’ identified by ‘123456’;
允许远程连接:
grant all privileges on . to ‘root’@’%’ with grant option;
刷新权限:
flush privileges;
3.Slave1 上安装 hive
首先我们需要创建工作路径,并将 hive 解压。环境中 master 作为客户端,slave1 作为服务器端,因此都需要使用到 hive。把hive安装包在master 中,因此我们先在 master 中对 hive 进行解压,然后将其复制到slave1 中。
把hive安装包传到master根目录中
1.建立工作路径
mkdir -p /usr/hive
2.解压缩
tar -zxvf apache-hive-2.1.1-bin.tar.gz -C /usr/hive/
再在slave1中建立工作路径,master远程拷贝至/usr/hive/
mkdir -p /usr/hive
scp -r /usr/hive/apache-hive-2.1.1-bin root@slave1:/usr/hive/
3.修改/etc/profile 文件设置 hive 环境变量。(master 和 slave1执行)
vi /etc/profile
添加以下内容
#set hive
export HIVE_HOME=/usr/hive/apache-hive-2.1.1-bin
export PATH=
P
A
T
H
:
PATH:
PATH:HIVE_HOME/bin
master上:
slave1上:
生效环境变量
source /etc/profile
4.因为服务端需要和 Mysql 通信,所以服务端需要 Mysql 的 lib 安装包到 Hive_Home/conf 目录下。
注意:mysql.jar 放在 slave2 中的目录下,需要将其远程复制到 slave1的 hive 的 lib 中。
将jar包传至slave2中,再执行
scp mysql-connector-java-5.1.47-bin.jar root@slave1:/usr/hive/apache-hive-2.1.1-bin/lib
需要手动输入密码是因为我们设置的ssh免密登录是指主节点可以免密登录从节点,而从节点没有设置ssh免密登录。
5.回到 slave1,修改 hive-env.sh 中 HADOOP_HOME 环境变量。
cd /usr/hive/apache-hive-2.1.1-bin/conf
cp -p hive-env.sh.template hive-env.sh
vi hive-env.sh
添加
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HIVE_CONF_DIR=/usr/hive/apache-hive-2.1.1-bin/conf
export HIVE_AUX_JARS_PATH=/usr/hive/apache-hive-2.1.1-bin/lib
6.修改 hive-site.xml 文件(在slave1上)
vi hive-site.xml
添加以下内容
rm -rf /usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/guava-11.0.2.jar
cp /usr/hive/apache-hive-2.1.1-bin/lib/guava-14.0.1.jar /usr/hadoop/hadoop-2.7.3/share/hadoop/yarn/lib/
2.修改 hive-env.sh
master上执行
cd /usr/hive/apache-hive-2.1.1-bin/conf
cp -p hive-env.sh.template hive-env.sh
vi hive-env.sh
添加
export HADOOP_HOME=/usr/hadoop/hadoop-2.7.3
export HIVE_CONF_DIR=/usr/hive/apache-hive-2.1.1-bin/conf
export HIVE_AUX_JARS_PATH=/usr/hive/apache-hive-2.1.1-bin/lib
3.修改 hive-site.xml(master上执行)
vi hive-site.xml
添加以下内容
3.slave1上执行
cd /usr/hive/apache-hive-2.1.1-bin
bin/hive --service metastore
出现下图中这个就服务器启动成功~~
4.master上执行
cd /usr/hive/apache-hive-2.1.1-bin
bin/hive
出现hive>后执行show databases;进行测试
出现下面这个就成功~~
大数据与人工智能应用赛题
说明:本次比赛为操作题。请在相应的虚拟机上作答,请遵守考试规则。
第一部分:大数据平台部署()
场景说明
目前,大数据技术及应用已经深入到各行各业,各高校也在积极建设信息化、智慧化校园,那么大数据中心建设必不可少,它可以服务于学校上游和下游,解决数据孤岛问题。假设现在某大学正在假设大数据中心,首先搭建大数据基础平台,用于数据存储和批量计算以及实时查询,现在请你完成Hadoop和Hive两个大数据框架的搭建及运维:
任务一、Hadoop安装()
1、配置SSH免密登录(截图成功ssh登录到子节点截图)
2、安装配置JDK(截图java -version命令)
3、解压Hadoop安装包并修改配置文件
4、配置环境变量(截图profile文件配置的关键位置)
5、拷贝hadoop到其他的机器上(截图拷贝命令)
6、初始化hadoop集群(截图执行命令)
7、启动Hadoop集群(启动成功后执行jps命令,截图主节点和子节点的进程)
任务二、配置Hive集群环境(5分)
Hive是基于Hadoop的一个数据仓库工具,其运行依赖Hadoop和Mysql,其中Hadoop为其提供Hdfs文件系统,Mysql为其提供元数据存储。下面我们开始搭建Hive。
1、Mysql安装(截图mysql搭建成功show databases命令结果界面2分)
2、Hive搭建(关键步骤截图2分)
3、启动测试hive(截图搭建成功show databases命令结果界面1分)
第二部分:大数据预处理部分(20分)
原来的日志数据格式是如下的:
appid ip mid userid login_type request status http_referer user_agent time
1、数据清洗:将 user_agent 为null的数据删除(10分)
规则一:如果数据中mid为null的数据,请过滤掉
规则二:将数据中字段login_type的值为1的全部替换为 “本系统登录”
规则三:将数据中字段status的值为0的全部替换为 ”第三方集成”
2、数据清洗:将不规整数据转化为规整数据(10)
但是如果需要按照省份来统计uv、pv,其所包含的信息还不够,我们需要对这些数据做一定的预处理,
对于其中包含的IP信息,我们需要将其对应的IP信息解析出来;
所以按照上面的分析,我们希望预处理之后的日志数据包含如下的数据字段:
appid;
ip;//通过ip来衍生出来的字段 province和city
province;
city;……………………………………….
第三部分:大数据分析(25分)
某学校有学生成绩文件:
包含学生课程名称,学生姓名,学生成绩等字段;
1、利用maperreduce操作统计每门课程的参考人数和课程平均分(5分)
2、统计每门课程参考学生的平均分,并且按课程存入不同的结果文件,要求一门课程一个结果文件,并且按平均分从高到低排序,分数保留一位小数。(10分)
任务三、基于hive的数据仓库离线计算编程(10分)
Hive作为基于hadoop的海量数据处理工具之一,在企业中有广泛应用。可以将复杂的MapReduce计算逻辑使用SQL逻辑处理。
1、 创建一个数据库,以你的组名命名,创建成功后使用use命令切换为该库,并执行set hive.cli.print.current.db=true;截图作
2、 建一个hive内部表,命名格式为:你的组名_日期_表名称,截图建表成功(2分)
3、 studentsScore.txt 导入hive表中(2分)。
4、使用sql语句统计上面创建的表中每门课程的平均分数,课程,平均分(4分)。
第四部分:可视化(15分)
数据:
有泰坦尼克号 公开数据集合数据:共有891行、12列。这代表本训练集共有891条数据,每条数据有12类信息。包括:
• PassengerId => 乘客ID
• Survived => 获救情况(1为获救,0为未获救)
• Pclass => 乘客等级(1/2/3等舱位)
• Name => 乘客姓名
• Sex => 性别
• Age => 年龄
• SibSp => 堂兄弟/妹个数
• Parch => 父母与小孩个数
• Ticket => 船票信息
• Fare => 票价
• Cabin => 客舱
• Embarked => 登船港口
要求用以上数据集合做可视化数据分析:
1、利用柱状图各乘客等级的获救与遇难情况(5分)
2、通过一张大图里分列几个小图来展示获救乘客的各种属性(10分)
了解到乘客的信息,获救人数与未获救人数比较,不同获救乘客等级之间获救人数比较,获救人员各年龄段分布,各口岸上船的乘客比较。如下:
1)柱状图展示 获救与遇难信息(3)
2)柱状图展示 乘客等级与人数信息(2)
3)散点图 展示 年龄与获救分布情况(5)
4)折线图 展示 各等级的乘客年龄分布(3)
5)柱状图 展示 各登船口岸上船人数(2)
第五部分 人工智能(10分)
目前人工智能技术广泛应用于各个场景,如分类聚类,图片图像识别,音视频检测等等。下面请你搭建人工智能中深度学习常用的框架之一 TensorFLow 并完成简单测试任务,本次实验在Linux环境下安装TensorFlow。
一、TensorFlow安装(7分)
1 Linux安装python3环境
2 使用pip3安装pip3 tensorflow
二、TensorFlow测试,将测试结果截图(3分)
进入python命令下,测试tensorflow:
import tensorflow as tf
sess = tf.Session()
hello=tf.constant(‘Hello,Tensorflow!’)
print(sess.run(hello))
回车,若在终端下显示 Hello,Tensorflow! 则表示安装tensorflow成功
第六部分:综合题(20分)
字段含义:id,小区名称,所在区域,总价(万元),单价(元/平米),房屋户型,所在楼层,建筑面积(㎡),户型结构,套内面积(㎡),建筑类型,房屋朝向,建筑结构,装修情况,梯户比例,配备电梯,产权年限,挂牌时间,交易权属,上次交易,房屋用途,房屋年限,产权所属,抵押信息,房本备件
1、 使用Spark将数据集中”房屋用途” 是 普通住宅 并且 交易权属 是 商品房 的相关的数据提取出来,并回写到ershoufang.txt文件中,如果文件ershoufang.txt存在就删除原有的文件 (请提供编程代码)(3分)。
代码文件:
生成的结果文件:
2 使用Spark统计”房屋用途” 是 普通住宅 相关的 所在区域的占比(请提供完整代码和结果截图5分)。
代码文件:
结果截图:
4 统计关于二手房分析。(本题可以使用你擅长的编程语言和框架)
4.1 各区域二手房房源数量,按照区域对数据集中房源数量进行计算,按照房源数排序(请提供完整代码和结果截图2分)
代码文件:
结果截图:
4.1 各区域二手房平均房价,按照区域对数据集中平均总价进行计算,按照平均总价排序(请提供完整代码和结果截图2分)
代码文件:
结果截图:
4.2 计算各区域二手房单价前5条的房源信息(请提供完整代码和结果截图4分)
代码文件:
结果截图:
4.3 针对于上述指标统计,请简要结合你分析的数据结果,描述当前二手房房价以及单价的分布情况(4分)。
现场赛-----可视化
第四部分:可视化(15分)
数据:
有泰坦尼克号 公开数据集合数据:共有891行、12列。这代表本训练集共有891条数据,每条数据有12类信息。包括:
• PassengerId => 乘客ID
• Survived => 获救情况(1为获救,0为未获救)
• Pclass => 乘客等级(1/2/3等舱位)
• Name => 乘客姓名
• Sex => 性别
• Age => 年龄
• SibSp => 堂兄弟/妹个数
• Parch => 父母与小孩个数
• Ticket => 船票信息
• Fare => 票价
• Cabin => 客舱
• Embarked => 登船港口
数据链接及提取码:
链接:https://pan.baidu.com/s/1WIUfb1GZnXGhka718BMYQA
提取码:dhf3
要求用以上数据集合做可视化数据分析:
1、 利用柱状图各乘客等级的获救与遇难情况(5分)
2、通过一张大图里分列几个小图来展示获救乘客的各种属性(10分)
了解到乘客的信息,获救人数与未获救人数比较,不同获救乘客等级之间获救人数比较,获救人员各年龄段分布,各口岸上船的乘客比较。如下:
1)柱状图展示 获救与遇难信息(3)
2)柱状图展示 乘客等级与人数信息(2)
3)散点图 展示 年龄与获救分布情况(5)
4)折线图 展示 各等级的乘客年龄分布(3)
5)柱状图 展示 各登船口岸上船人数(2)
代码
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
f = open(r’D:\BDA\大数据比赛数据\Titanic.csv’,‘r’,encoding=‘utf-8’)
data1 = pd.read_csv(f)
data1.head()
figure,ax = plt.subplots(3,2,figsize=(14,14))
#柱状图一
y1 = data1.groupby(‘Survived’)[‘Survived’].count().values
x1 = [0,1]
names = [‘未获救’,‘获救’]
ax[0][0].bar(x1,y1,color=‘g’,tick_label=names)
for a,b in zip(x1,y1):
ax[0][0].text(a,b+0.1,b,ha=‘center’,va=‘center’)
ax[0][0].set_ylabel(‘人数’)
ax[0][0].set_title(‘获救与遇难人数’)
#柱状图二
s1 = data1[‘Survived’].loc[(data1[‘Survived’]==1)&(data1[‘Pclass’]==1)].count()
s2 = data1[‘Survived’].loc[(data1[‘Survived’]==1)&(data1[‘Pclass’]==2)].count()
s3 = data1[‘Survived’].loc[(data1[‘Survived’]==1)&(data1[‘Pclass’]==3)].count()
y2 = [s1,s2,s3]
names = [‘一等’,‘二等’,‘三等’]
x2 = np.arange(len(names))
ax[0][1].bar(x2,y2,color=‘g’,tick_label=names)
for a,b in zip(x2,y2):
ax[0][1].text(a,b+0.1,b,ha=‘center’,va=‘center’)
ax[0][1].set_ylabel(‘人数’)
ax[0][1].set_title(‘各等级获救人数信息’)
#散点图
data2 = data1.groupby([‘Survived’,‘Age’],as_index=False)[‘Survived’].sum()
x3 = data2.unstack().columns.values.tolist() #获取列名列表
y3 = data2.unstack().iloc[1]
ax[1][0].scatter(x3,y3,color=‘y’)
ax[1][0].set_xlabel(‘年龄’)
ax[1][0].set_ylabel(‘人数’)
ax[1][0].set_title(‘年龄与获救分布情况’)
#折线图
data2 = data1.groupby([‘Pclass’,‘Age’])[‘Age’].count().unstack()
x = data2.columns.values.tolist()
y1 = data2.loc[1]
y2 = data2.loc[2]
y3 = data2.loc[3]
ax[1][1].plot(x,y1,color=‘red’,label=‘一等’)
ax[1][1].plot(x,y2,color=‘green’,label=‘二等’)
ax[1][1].plot(x,y3,color=‘blue’,label=‘三等’)
ax[1][1].legend()
ax[1][1].set_xlabel(‘年龄’)
ax[1][1].set_ylabel(‘人数’)
ax[1][1].set_title(‘各等级乘客年龄分布’)
ax[1][1].set_xlim(0,90)
#柱状图三
data2 = data1.groupby([‘Embarked’])[‘Sex’].count()
y = data2.values
x = data2.index
ax[2][0].bar(x,y,color=‘g’)
for a,b in zip(x,y):
ax[2][0].text(a,b+0.1,b,ha=‘center’,va=‘bottom’)
ax[2][0].set_xlabel(‘登船口岸’)
ax[2][0].set_ylabel(‘人数’)
ax[2][0].set_title(‘各登船口岸上船人数’)
plt.show()
结果
网络赛----可视化
第四部分:可视化(15分)
近些年空气污染在我国很多地区非常严重,其中PM2.5作为衡量空气质量的一个重要指标,当前数据为2018年12月份1号-10号全国大部分城市的站点检测数据。接下来我们将这些数据进行可视化来看下PM2.5的分布情况。
数据:
链接:https://pan.baidu.com/s/1AzgRiCxpCZ8-we8sfRMAFw
提取码:0j57
1、 利用Bar图输出城市(city)合肥、黄山、芜湖的PM2.5指数,Y轴表示平均数,;X轴表示城市名称,(5分)
要求将输出的直方图保存成图像文件,程序源代码截图
代码:
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series,DataFrame
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] #用来正常显示中文标签
f = open(r"D:\BDA\大数据比赛数据\airpm25.txt",“r”,encoding=‘utf-8’)
data1 = pd.read_csv(f,header=None,names = [‘日期’,‘pm2.5’,‘城市’,‘具体位置’]) #设置header参数,读取文件的时候没有标题
s = data1.groupby(‘城市’)[‘pm2.5’].mean().reset_index()
s = s.set_index(‘城市’) #设置DataFrame索引为某一列索引值
plt.bar([‘黄山’],s.loc[‘黄山’,[‘pm2.5’]],label = ‘黄山’)
plt.bar([‘合肥’],s.loc[‘合肥’,[‘pm2.5’]],label = ‘合肥’)
plt.bar([‘芜湖’],s.loc[‘芜湖’,[‘pm2.5’]],label = ‘芜湖’)
plt.legend()
plt.xlabel(‘城市’)
plt.ylabel(‘平均pm2.5’)
plt.show()
结果:
2、 利用折线图,画出城市,各城市随时间的pm2.5值变化
要求将输出的折线图保存成图像文件Y轴表示pm2.5的值,X轴表示日期,城市
要求:(5分)
折线图中含图例;
不同的城市用不同的颜色表达;
在这里因为城市有100多个,所以我将题目理解为还是这三个城市,即合肥、芜湖、黄山。
代码
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series,DataFrame
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] #用来正常显示中文标签
f = open(r"D:\BDA\大数据比赛数据\airpm25.txt",“r”,encoding=‘utf-8’)
data1 = pd.read_csv(f,header=None,names = [‘日期’,‘pm2.5’,‘城市’,‘具体位置’]) #设置header参数,读取文件的时候没有标题
data2 = data1.groupby([‘城市’,‘日期’])[‘pm2.5’].mean().reset_index()
data2 = data2.set_index(‘城市’)
s1 = data2.loc[‘合肥’]
y1 = s1[‘pm2.5’].values
s2 = data2.loc[‘黄山’]
y2 = s2[‘pm2.5’].values
s3 = data2.loc[‘芜湖’]
y3 = s3[‘pm2.5’].values
x = pd.date_range(‘2018-12-01’,periods=10)
fig = plt.figure(figsize=(10,3))
plt.plot(x,y1,color=‘r’,marker=‘o’,label = ‘合肥’)
plt.plot(x,y2,color=‘g’,marker=‘o’,label = ‘黄山’)
plt.plot(x,y3,color=‘y’,marker=‘o’,label = ‘芜湖’)
plt.xlabel(‘日期’)
plt.ylabel(‘pm2.5’)
plt.legend()
plt.savefig(r’D:\BDA\大数据比赛数据\3.2.png’) #保存图片
plt.show()
结果:
3、利用柱线混合图形画出合肥市,高新区,庐阳区的pm2.5的值。要求将输出的折线图保存成图像文件,X轴表示时间,柱状表示 高新区 的pm2.5的值,线形表示 庐阳区的pm2.5的值。(5分)
要求:
1) 图形中含有图例
代码
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series,DataFrame
f = open(r"D:\BDA\大数据比赛数据\airpm25.txt",“r”,encoding=‘utf-8’)
data1 = pd.read_csv(f,header=None,names = [‘日期’,‘pm2.5’,‘城市’,‘具体位置’])
#设置header参数,读取文件的时候没有标题
data2 = data1.groupby([‘城市’,‘具体位置’,‘日期’])[‘pm2.5’].mean()
data2 = data2.unstack()
data3 = data2.loc[‘合肥’,‘高新区’]
y1 = data3.values
data4 = data2.loc[‘合肥’,‘庐阳区’]
y2 = data4.values
x = pd.date_range(‘2018-12-01’,periods=10)
fig = plt.figure(figsize=(10,4))
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] #用来正常显示中文标签
plt.bar(x,y1,color=‘b’,)
plt.plot(x,y2,color=‘black’,marker=‘o’,label=‘庐阳区’)
plt.legend()
plt.xlabel(‘日期’)
plt.ylabel(‘高新区pm2.5’)
plt.title(‘合肥市高新区和庐阳区的pm2.5值’)
plt.savefig(r’D:\BDA\大数据比赛数据\3.3.png’)
plt.show()
结果:
获取高新区与庐阳区pm2.5值得另一种方法:
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series,DataFrame
f = open(r"D:\BDA\大数据比赛数据\airpm25.txt",“r”,encoding=‘utf-8’)
data1 = pd.read_csv(f,header=None,names = [‘日期’,‘pm2.5’,‘城市’,‘具体位置’])
#设置header参数,读取文件的时候没有标题
s = data1.loc[(data1[‘城市’]‘合肥’)&(data1[‘具体位置’]‘高新区’)][‘pm2.5’]
s
2018年安徽省大数据网络赛数据分析(三)
数据
36.63.116.201|sdk.conf.igexin.com|20170207161935|61.147.218.24;222.186.20.109;222.186.20.123|0
36.63.123.215|cm052.getui.igexin.com|20170207161935|183.131.1.82|0
36.63.132.38|mmbiz.qpic.cn|20170207161935|122.228.72.152;115.231.191.141;122.228.72.165;122.228.72.151;122.228.72.147;115.231.191.143;122.228.72.163;122.228.72.159;115.231.191.144;122.228.56.
157;122.228.72.166;122.228.56.155;122.228.72.164;122.228.56.156;115.231.191.142;122.228.72.148|0117.70.249.121|punch.p2p.qq.com|20170207161935|14.17.43.40|0
114.102.113.19|omgmta.play.t002.ottcn.com|20170207161935|123.151.179.173|0
36.63.40.131|pop.sjk.ijinshan.com|20170207161935|60.169.76.70;61.132.239.147;61.132.239.146|0
36.5.84.35|bird.sns.iqiyi.com|20170207161935|106.38.219.54;106.38.219.34|0
36.4.13.244|tx2.a.yximgs.com|20170207161935|61.191.60.17;61.191.60.16;61.191.60.19;61.191.60.18|0
36.4.151.103|r.vip.qq.com|20170207161935|14.215.138.24|0
223.244.111.107|supportcmsecurity1.ksmobile.com|20170207161935|221.228.204.21;119.147.146.70|0
数据说明:第二个字段为访问的网站地址,分隔符为‘|’
题目
统计该原始数据集中网站被访问次数最多的前5名的网站地址和次数
思路
在这里我想的是采用两个job,编写两个Mapper和两个Reducer,它们各自要实现以下功能:
第一个job:
map():记录原始数据每行的网站地址如:sdk.conf.igexin.com,并将其出现次数标记为1。输出sdk.conf.igexin.com 1
reduce():将map端传来的数据,进行次数的累加。输出sdk.conf.igexin.com 9.这里的次数只是为了说明思路,实际上有可能并不是这些。
第二个job:
map():将第一个job的reduce端传来的数据交换key与value,并按照key次数进行倒序排序。输出: 9 sdk.conf.igexin.com
reduce(): 将所有具有相同访问次数的网站地址进行连接。如{9,{sdk.conf.igexin.com,cm052.getui.igexin.com}这样的形式。
实际上我们这里采用了MapReduce组合式计算作业中的迭代式计算
MapReduce迭代式计算的中心思想就是前一个MapReduce的输出结果将作为下一个MapReduce的输入,任务完成后中间结果都可以删除。例如,现在有3个MapReduce子任务,其中子任务1的输出目录Outpath1将作为子任务2的输入目录,而子目录2的输出目录Outpath2又将作为子任务3的输入目录。设置代码如下:
Configuration conf = new Configuration();
//子任务1配置代码
Job job1 = Job.getInstance(conf, "job1");
......
FileInputFormat.addInputPath(job1,new Path(args[0]));
FileOutputFormat.setOutputPath(job1,new Path(args[1]));
job1.waitForCompletion(true);
//子任务2配置代码
Job job2 = Job.getInstance(conf, "job2");
......
FileInputFormat.addInputPath(job2,new Path(args[1]));
FileOutputFormat.setOutputPath(job2,new Path(args[2]));
job2.waitForCompletion(true);
//子任务3配置代码
Job job2 = Job.getInstance(conf, "job3");
......
FileInputFormat.addInputPath(job3,new Path(args[2]));
FileOutputFormat.setOutputPath(job3,new Path(args[3]));
job3.waitForCompletion(true);
子任务作业配置代码运行后,会按顺序执行每个子作业,由于后一个子任务需要使用前一个子任务的输出结果,因此,每一个子任务需要等到前一个子任务执行完成后才能执行,这是通过job.waitForCompletion(true)方法实现的。
代码
package com.mr2;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class FenTwo
{
/*数据:
36.63.116.201|sdk.conf.igexin.com|20170207161935|61.147.218.24;222.186.20.109;222.186.20.123|0
36.63.123.215|cm052.getui.igexin.com|20170207161935|183.131.1.82|0
*/
//第一个map()方法将数据处理为<网站地址,出现1次>
public static class MyMapperOne extends Mapper<LongWritable,Text,Text,IntWritable>
{
protected void map(LongWritable k1,Text v1,Context context) throws IOException, InterruptedException
{
IntWritable one = new IntWritable(1);
String s = v1.toString();
String[] split = s.split("\|");
context.write(new Text(split[1]), one);
}
}
//第一个reduce()方法将传来的数据处理为<网站地址,出现总次数>
public static class MyReduceOne extends Reducer<Text,IntWritable,Text,IntWritable>
{
protected void reduce(Text k2, Iterable v2,Context context) throws IOException, InterruptedException
{
int sum = 0;
for(IntWritable val : v2)
{
sum += val.get();
}
context.write(k2, new IntWritable(sum));
}
}
//第二个map()方法将第一个Reduce传来的数据处理为<出现总次数,网站地址>这样最终的输出结果就可以按照次数排序
public static class MyMapperTwo extends Mapper<LongWritable,Text,IntWritable,Text>
{
protected void map(LongWritable k3, Text v3,Context context) throws IOException, InterruptedException
{
String s = v3.toString();
String[] split = s.split("\t");
int m = Integer.parseInt(split[1]);
context.write(new IntWritable(m),new Text(split[0]));
}
}
//利用这个类实现出现次数的倒序排序
public static class MyNumberComparator extends IntWritable.Comparator
{
@Override
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
{
// TODO Auto-generated method stub
return -super.compare(b1, s1, l1, b2, s2, l2);
}
}
//第二个reduce()方法将数据处理为<出现总次数,{网站地址1,网站地址2,}>
public static class MyReduceTwo extends Reducer<IntWritable,Text,IntWritable,Text>
{
protected void reduce(IntWritable k4, Iterable
{
StringBuffer s = new StringBuffer();
for(Text val : v4)
{
String m = val.toString();
s.append(m+",");
}
//利用substring()将value后面的","给去了
String s1 = s.substring(0, s.length()-1);
context.write(k4, new Text(s1));
}
}
public static void main(String args[]) throws IOException,ClassNotFoundException,InterruptedException
{
Configuration conf = new Configuration();
Job job1 = Job.getInstance(conf, "job1");
job1.setJarByClass(FenTwo.class);
job1.setMapperClass(MyMapperOne.class);
job1.setReducerClass(MyReduceOne.class);
job1.setMapOutputKeyClass(Text.class);
job1.setMapOutputValueClass(IntWritable.class);
job1.setOutputKeyClass(Text.class);
job1.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job1,new Path(args[0]));
FileOutputFormat.setOutputPath(job1,new Path(args[1]));
job1.waitForCompletion(true);
Job job2= Job.getInstance(conf, "job2");
job2.setJarByClass(FenTwo.class);
job2.setMapperClass(MyMapperTwo.class);
job2.setSortComparatorClass(MyNumberComparator.class);
job2.setReducerClass(MyReduceTwo.class);
job2.setMapOutputKeyClass(IntWritable.class);
job2.setMapOutputValueClass(Text.class);
job2.setOutputKeyClass(IntWritable.class);
job2.setOutputValueClass(Text.class);
//将第一输出文件的路径作为第二个的文件输入路径
FileInputFormat.addInputPath(job2 ,new Path(args[1]));
FileOutputFormat.setOutputPath(job2,new Path(args[2]));
job2.waitForCompletion(true);
}
}
执行命令
因为从来没有使用过这个方法,所以第一开始时我使用了命令hadoop jar jar包名 所运行的类 /输入路径 /输出路径运行jar包,运行后出现了Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 2的错误,后来经百度是因为在执行的过程中需要3个输入,而在初始化时只申请了2个位置。
后来在无意中使用了hadoop jar jar包名 所运行的类 /输入路径1 /输出路径1(输入路径2) /输出路径2 这样的方法最后运行成功。
hadoop jar three.jar com/mr2/FenTwo /Mrone/dns_log.txt /tmp/20 /tmp/21
结果
因为题目要求是排名前五的,所以这里直接使用了| head -5命令这样就可以不用在程序中对其进行处理了。
2019年安徽省大数据网络赛数据预处理(三)
数据
zhan.txt
zhan.txt其实就是预处理二所得的数据,因为不想把原来的数据所替换,所以重命名为zhan.txt了
“uid”:“131192622122401792” “platform”:“Android” “app_version”:“1007030202” “pid”:“5616” “cityid”:“626”
“uid”:“131192622122401792” “platform”:“Android” “app_version”:“1007030202” “pid”:“5616” “cityid”:“626”
“uid”:“131192622122401792” “platform”:“Android” “app_version”:“1007030202” “pid”:“5616” “cityid”:“626”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“142873087346606080” “platform”:“Android” “app_version”:“1007090002” “pid”:“5057” “cityid”:“86”
“uid”:“161350486564405248” “platform”:“Android” “app_version”:“1007060402” “pid”:“8888” “cityid”:“1750”
“uid”:“161350486564405248” “platform”:“Android” “app_version”:“1007060402” “pid”:“8888” “cityid”:“1750”
cityid.txt文件的数据如下:
1701|桐城市|桐城市|安徽|中国|安庆市|华东地区|四线城市|31.05228|116.93861
1702|宿松县|宿松县|安徽|中国|安庆市|华东地区|四线城市|30.151213|116.1142
1703|枞阳县|枞阳县|安徽|中国|安庆市|华东地区|四线城市|30.69371|117.21059
1704|太湖县|太湖县|安徽|中国|安庆市|华东地区|四线城市|30.420059|116.26508
1705|怀宁县|怀宁县|安徽|中国|安庆市|华东地区|四线城市|30.409006|116.64709
1706|岳西县|岳西县|安徽|中国|安庆市|华东地区|四线城市|30.857161|116.35818
1707|望江县|望江县|安徽|中国|安庆市|华东地区|四线城市|30.123537|116.67433
1708|潜山县|潜山县|安徽|中国|安庆市|华东地区|四线城市|30.630346|116.5672
5317|迎江区|迎江区|安徽|中国|安庆市|华东地区|四线城市|30.511548|117.09115
5318|大观区|大观区|安徽|中国|安庆市|华东地区|四线城市|30.553957|117.02167
1691|怀远县|怀远县|安徽|中国|蚌埠市|华东地区|四线城市|32.95665|117.19356
1692|固镇县|固镇县|安徽|中国|蚌埠市|华东地区|四线城市|33.314575|117.31171
1693|五河县|五河县|安徽|中国|蚌埠市|华东地区|四线城市|33.139736|117.88253
题目要求
此为数据处理的常用方式,进行两个数据集的关联。将把log.log文件处理后的文件中city的值对应编号关联匹配数据cityid.txt,将城市编码替换为城市名称输出。
代码
package com.mr2;
import java.io.IOException;
import java.util.Vector;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class preThree {
public static class MyMapper extends Mapper<LongWritable,Text,Text,Text>
{
/*
* zhan.txt文件数据:
* “uid”:“479489006” “platform”:“Android” “app_version”:“1007090002” “pid”:“5599” “cityid”:“5491”
“uid”:“479489006” “platform”:“Android” “app_version”:“1007090002” “pid”:“5599” “cityid”:“5491”
* cityid.txt文件数据:
* 1701|桐城市|桐城市|安徽|中国|安庆市|华东地区|四线城市|31.05228|116.93861
* 1702|宿松县|宿松县|安徽|中国|安庆市|华东地区|四线城市|30.151213|116.1142
*/
private FileSplit inputsplit; //记录分片信息
protected void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException
{
inputsplit = (FileSplit)context.getInputSplit(); //获取分片信息
String filename = inputsplit.getPath().getName(); //获取文件名称
if(filename.contains(“zhan”)) //判断输入的路径信息
{
String s = value.toString();
String[] split = s.split(" “);
//String[] split = s.split(”\s+");
/提取出两文件连接的key/
String[] m = split[4].split("😊;
if(m[1].length()>0) //利用if()过滤掉cityid为空的数据,防止下面数组下标越界
{
String joinkey = m[1].substring(1,m[1].length()-1); //将提取的joinkey与在cityid文件里的一致
//String joinKey = split[4].substring(“cityid”.length()+4,split[4].length()-1);
//取出value,并打上标记
String joinvalue = “zhan”+split[0]+" “+split[1]+” “+split[2]+” "+split[3];
context.write(new Text(joinkey),new Text(joinvalue));
}
}
if(filename.contains("city"))
{
String s = value.toString();
String[] split = s.split("\\|");
context.write(new Text(split[0]),new Text("cityid"+split[5]));
}
}
}
public static class MyReduce extends Reducer<Text,Text,Text,Text>
{
protected void reduce(Text k2,Iterable
{
Vector vecA = new Vector();
Vector vecB = new Vector();
for(Text value : v2)
{
String line = value.toString();
if(line.startsWith(“zhan”))
{
vecA.add(line.substring(“zhan”.length())); //将"zhan"文件对应joinvalue加入vacA,注意不要写成line.substring(4)因为还有双引号
}
if(line.startsWith(“cityid”))
{
// vecB.add(line.substring(6));//将"cityid"文件对应joinvalue加入vecB
vecB.add(line.substring(“cityid”.length()));
}
}
for(String s1 : vecA) //利用两个for()循环进行笛卡儿积
{
for(String s2 : vecB)
{
context.write(new Text(s1),new Text("“cityid”"+":"+"""+s2+"""));
}
}
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException
{
// TODO Auto-generated method stub
Configuration conf = new Configuration();
Job job = Job.getInstance(conf,preThree.class.getSimpleName());
job.setJarByClass(preThree.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReduce.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
//输入一个路径,将两个文件放在一个文件夹下,在执行hadoop jar命令的时候可以精确到文件夹的名字
//如/Mrtwo,而不用精确到具体文件/Mrtwo/zhan.txt /Mrtwo/log.log如何使用后者则需要给出两个输入路径
FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
job.waitForCompletion(true);
}
}
注意:
在对两个文件进行取joinkey时一定要确保一致,否则经过reduce()函数之后,文件没有输出。我就这困扰了很久,取zhan.txt的joinkey时带了双引号,如"9541",而取cityid.txt的时候却没有带双引号,如9541。
结果
2019年安徽省大数据网络赛数据预处理(二)
数据
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276436920”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“NEWLIVEVIEW_QUIT_TAB”,“value”:“0”,“du”:""}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276436923”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“EVENT_ZIP_UPLOAD”,“value”:“1”,“du”:""},“properties”:{“property1”:“1”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276844841”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“AMAP_LOCATION_UPDATE”,“value”:“0”,“du”:“446”},“properties”:{“property1”:“0”,“property3”:“1”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276844865”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“HTTP_START”,“value”:“http://weather.api.moji.com/data/detail”,“du”:""},“properties”:{“property1”:“1”,“property2”:“0”,“property3”:"{“common”:{“platform”:“Android”,“identifier”:“869121033612809”,“app_version”:“1007090002”,“os_version”:“23”,“device”:“MYA-AL10”,“pid”:“5057”,“language”:“CN”,“uid”:“188495963831271424”,“uaid”:“0”,“width”:720,“height”:1192,“package_name”:“com.moji.mjweather”,“amp”:“1557276844828”,“locationcity”:0,“current_city”:2503,“token”:“ac96b2c49daaeb0e8fdc9671ede79022”},“params”:{“city”:[{“avatarId”:8,“type”:1,“lat”:31.28037,“lon”:104.452387,“coordinate”:2,“location”:“四川省德阳市罗江区G5京昆高速靠近侯家湾”,“voice”:{“lang”:“CN”,“tu”:“c”,“wu”:“beau”},“cr”:1}]}}",“property4”:“1557276844829-f0fceefb1c2f4ef6a1fc271ed97a9bdf-188495963831271424”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845076”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“HTTP_UPDATE”,“value”:“http://weather.api.moji.com/data/detail”,“du”:“243”},“properties”:{“property1”:0,“property4”:“1”,“property5”:“1557276844829-f0fceefb1c2f4ef6a1fc271ed97a9bdf-188495963831271424”,“property6”:“weather.api.moji.com/111.13.70.18:80”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845226”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“WEATHER_UPDATE”,“value”:“1”,“du”:“327”},“properties”:{“property1”:1,“property2”:-1,“property3”:“http://weather.api.moji.com/data/detail”,“property4”:“2”,“property5”:“RequestParams:[city=[{“avatarId”:8,“type”:1,“lat”:31.28037,“lon”:104.452387,“coordinate”:2,“location”:“四川省德阳市罗江区G5京昆高速靠近侯家湾”,“voice”:{“lang”:“CN”,“tu”:“c”,“wu”:“beau”},“cr”:1}]], commonParams:{“platform”:“Android”,“identifier”:“869121033612809”,“app_version”:“1007090002”,“os_version”:“23”,“device”:“MYA-AL10”,“pid”:“5057”,“language”:“CN”,“uid”:“188495963831271424”,“uaid”:“0”,“width”:720,“height”:1192,“package_name”:“com.moji.mjweather”,“amp”:“1557276844828”,“locationcity”:0,“current_city”:2503,“token”:“ac96b2c49daaeb0e8fdc9671ede79022”}”,“property6”:“1557276844829-f0fceefb1c2f4ef6a1fc271ed97a9bdf-188495963831271424”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845304”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“SHOWER_CONDITION_CONSIS_MONITOR”,“value”:“1”,“du”:""},“properties”:{“property1”:0,“property2”:0,“property3”:“31.28037,104.452387”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845312”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“LOCATION_UPDATE”,“value”:“0”,“du”:“1096”},“properties”:{“property1”:“0”,“property3”:“1”}}
题目要求
将原始数据中用户的"uid",“platform”,“app_version”,“pid”,"cityid"五个字段和其对应的值提取出来。
代码
package com.mr2;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class preTwo {
public static class MyMapper extends Mapper<LongWritable,Text,Text,NullWritable>
{
/*
* 数据
* {“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,
* “app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,
* “iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557282063721”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“SHOWER_CONDITION_CONSIS_MONITOR”,“value”:“1”,“du”:""},“properties”:{“property1”:0,“property2”:0,“property3”:“31.280233,104.452469”}}
*/
protected void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException
{
StringBuffer k = new StringBuffer();
String s = String.valueOf(value);
//将原始数据进行切分
String[] split = s.split(",");
for(int i=0;i<split.length;i++)
{
//利用条件"uid":“等可以过滤数据commonParams:{“platform”:“Android”,“identifier”:“869121033612809”,“app_version”:“1007090002”,“os_version”:“23”,“device”:“MYA-AL10”,“pid”:“5057”,“language”:“CN”,“uid”:
if(split[i].contains(“uid”:”)||split[i].contains(“platform”:")||split[i].contains(“app_version”:")||split[i].contains(“pid”:")||split[i].contains(“cityid”😊)
{
//利用这个if()过滤掉数据{“common”:{“uid”:“417705234” “platform”:“Android” “app_version”:“1001010000” “pid”:“4025” “cityid”:""
if(split[i].contains(“uid”😊)
{
int m = split[i].indexOf(“uid”);
//从"uid"开始截取split[i]而不是从{“common”:
k.append(split[i].substring(m-1)+" “);
}
else
{
k.append(split[i]+” ");
}
}
}
String k1 = k.substring(0,k.length()-1);
context.write(new Text(k1), NullWritable.get());
}
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException
{
// TODO Auto-generated method stub
Configuration conf = new Configuration();
Job job = Job.getInstance(conf,preTwo.class.getSimpleName());
job.setJarByClass(preTwo.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(Reducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
job.waitForCompletion(true);
}
}
结果
大数据网络赛数据预处理(-)
数据样式
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276436920”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“NEWLIVEVIEW_QUIT_TAB”,“value”:“0”,“du”:""}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276436923”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“EVENT_ZIP_UPLOAD”,“value”:“1”,“du”:""},“properties”:{“property1”:“1”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276844841”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“AMAP_LOCATION_UPDATE”,“value”:“0”,“du”:“446”},“properties”:{“property1”:“0”,“property3”:“1”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276844865”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“HTTP_START”,“value”:“http://weather.api.moji.com/data/detail”,“du”:""},“properties”:{“property1”:“1”,“property2”:“0”,“property3”:"{“common”:{“platform”:“Android”,“identifier”:“869121033612809”,“app_version”:“1007090002”,“os_version”:“23”,“device”:“MYA-AL10”,“pid”:“5057”,“language”:“CN”,“uid”:“188495963831271424”,“uaid”:“0”,“width”:720,“height”:1192,“package_name”:“com.moji.mjweather”,“amp”:“1557276844828”,“locationcity”:0,“current_city”:2503,“token”:“ac96b2c49daaeb0e8fdc9671ede79022”},“params”:{“city”:[{“avatarId”:8,“type”:1,“lat”:31.28037,“lon”:104.452387,“coordinate”:2,“location”:“四川省德阳市罗江区G5京昆高速靠近侯家湾”,“voice”:{“lang”:“CN”,“tu”:“c”,“wu”:“beau”},“cr”:1}]}}",“property4”:“1557276844829-f0fceefb1c2f4ef6a1fc271ed97a9bdf-188495963831271424”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845076”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“HTTP_UPDATE”,“value”:“http://weather.api.moji.com/data/detail”,“du”:“243”},“properties”:{“property1”:0,“property4”:“1”,“property5”:“1557276844829-f0fceefb1c2f4ef6a1fc271ed97a9bdf-188495963831271424”,“property6”:“weather.api.moji.com/111.13.70.18:80”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845226”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“WEATHER_UPDATE”,“value”:“1”,“du”:“327”},“properties”:{“property1”:1,“property2”:-1,“property3”:“http://weather.api.moji.com/data/detail”,“property4”:“2”,“property5”:“RequestParams:[city=[{“avatarId”:8,“type”:1,“lat”:31.28037,“lon”:104.452387,“coordinate”:2,“location”:“四川省德阳市罗江区G5京昆高速靠近侯家湾”,“voice”:{“lang”:“CN”,“tu”:“c”,“wu”:“beau”},“cr”:1}]], commonParams:{“platform”:“Android”,“identifier”:“869121033612809”,“app_version”:“1007090002”,“os_version”:“23”,“device”:“MYA-AL10”,“pid”:“5057”,“language”:“CN”,“uid”:“188495963831271424”,“uaid”:“0”,“width”:720,“height”:1192,“package_name”:“com.moji.mjweather”,“amp”:“1557276844828”,“locationcity”:0,“current_city”:2503,“token”:“ac96b2c49daaeb0e8fdc9671ede79022”}”,“property6”:“1557276844829-f0fceefb1c2f4ef6a1fc271ed97a9bdf-188495963831271424”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845304”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“SHOWER_CONDITION_CONSIS_MONITOR”,“value”:“1”,“du”:""},“properties”:{“property1”:0,“property2”:0,“property3”:“31.28037,104.452387”}}
{“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,“platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,“pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,“iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276845312”,“versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“LOCATION_UPDATE”,“value”:“0”,“du”:“1096”},“properties”:{“property1”:“0”,“property3”:“1”}}
需求
需求一:
如果数据中uid,platform,app_version,pid四个字段不同时出现,请过滤掉
将数据字段中locationcity的值为0的全部替换为1
代码
package com.mr2;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class preOne {
public static class MyMapper extends Mapper<LongWritable,Text,Text,NullWritable>
{
/*
* 数据:
* {“common”:{“locationcity”:0,“uid”:“188495963831271424”,“uaid”:“0”,
* “platform”:“Android”,“app_version”:“1007090002”,“net”:“WIFI”,
* “pid”:“5057”,“identifier”:“869121033612809”,“cityid”:“2503”,
* “iccid”:“89860077221897301901”,“snsid”:"",“ts”:“1557276436920”,
* “versionType”:“1”,“pkg”:“com.moji.mjweather”},“event”:{“key”:“NEWLIVEVIEW_QUIT_TAB”,“value”:“0”,“du”:""}}
*/
protected void map(LongWritable key,Text value,Context context) throws IOException,InterruptedException
{
StringBuffer k = new StringBuffer();
String m = String.valueOf(value);
/*利用if()实现规则一。*/
if(m.contains("uid")&&m.contains("platform")&&m.contains("app_version")&&m.contains("pid"))
{
String[] n = m.split(",");
/*将n[1]:{"common":{"locationcity":0在进行拆分*/
String[] s = n[0].split(":");
if(s[2].equals("0"))
{
s[2]="1";
}
for(int i=0;i<s.length-1;i++)
{
k.append(s[i]+":");
}
k.append(s[s.length-1]);
for(int i=1;i<n.length;i++)
{
k.append(","+n[i]);
}
context.write(new Text(String.valueOf(k)), NullWritable.get());
}
}
}
public static void main(String[] args) throws IOException,InterruptedException, ClassNotFoundException
{
Configuration conf = new Configuration();
Job job = Job.getInstance(conf,preOne.class.getSimpleName());
job.setJarByClass(preOne.class);
job.setMapperClass(MyMapper.class);
/*采用默认的reducer类*/
job.setReducerClass(Reducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(NullWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(NullWritable.class);
FileInputFormat.addInputPath(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
job.waitForCompletion(true);
}
}
结果
大数据应用大赛 可视化部分
近些年空气污染在我国很多地区非常严重,其中PM2.5作为衡量空气质量的一个重要指标,当前数据为2018年12月份1号-10号全国大部分城市的站点检测数据。接下来我们将这些数据进行可视化来看下PM2.5的分布情况。
需首先安装Python的numpy和matplotlib库
相关数据链接:https://pan.baidu.com/s/1ox8Y77OPVFK20LAGX3CesA
提取码:cvx1
题目:
利用柱状图输出合肥、黄山、芜湖的PM2.5指数,Y轴表示PM2.5的平均数,X轴表示城市名称
要求:将输出的直方图保存成图像文件,程序源代码截图
代码文件:
import numpy as np
from matplotlib import pyplot as plt
txt=open(“airpm25.txt”, encoding=‘utf8’)
a = np.loadtxt(txt, dtype=np.str, delimiter=’,’) # load 时也要指定为逗号分隔
didian = [‘合肥’,‘黄山’,‘芜湖’]
suju=[[],[]]
for dd in didian:
yao1 = np.where(a[…,2]==dd)#选择地点是合肥的数据
b = np.array(a[yao1][…, 1], dtype=np.int32)#将合肥的数据汇总成一个numpy数组,指定数据类型是数字
zhi = np.mean(b)#求平均值
suju[0].append(dd)
suju[1].append(zhi)
print(suju)
plt.bar(suju[0], suju[1]) # 传入x和y 通过plot绘制出折线图
plt.rcParams[‘font.sans-serif’] = [‘KaiTi’] # 指定默认字体
plt.title(’{}的PM2.5指数’.format(",".join(didian)))
plt.xlabel(‘城市名称’)
plt.ylabel(‘pm2.5的平均值’)
plt.show() #展示图像
结果截图:
用折线图,画出合肥、黄山、芜湖各城市随时间的pm2.5平均值的变化要求将输出的折线图保存成图像文件,Y轴表示pm2.5的平均值,X轴表示日期
要求:折线图中含图例;不同的城市用不同的颜色表达;
代码文件:
import numpy as np
from matplotlib import pyplot as plt
txt=open(“airpm25.txt”, encoding=‘utf8’)
a = np.loadtxt(txt, dtype=np.str, delimiter=’,’) # load 时也要指定为逗号分隔
didian = [“合肥”,“黄山”,“芜湖”]
suju=[]
for dd in didian:
yao1 = np.where(a[…,2]==dd)#选择地点是合肥的数据
shijian = np.unique(a[yao1][…,0])#将上述数据中的时间提取出来,并且去重,存入时间的列表
shijian_zhi =[]#用于记录这一个地点的数据
for x in np.nditer(shijian):
yao = np.where(a[yao1][…,0] == x)#从时间的列表中选择对应时间的数据,
b = np.array(a[yao1][yao][…, 1], dtype=np.int32)#将这一天所有的数据汇总成一个numpy数组,指定数据类型是数字
zhi = np.mean(b)#求平均值
shijian_zhi.append(zhi)
suju.append([shijian.tolist(),shijian_zhi])
print(suju)
def fx(x):
return x[-2:]
#x轴 y轴的数据一起组成了要绘制出的图形
for i in range(len(suju)):
plt.plot(list(map(fx, suju[i][0])), suju[i][1], label=didian[i]) # 传入x和y 通过plot绘制出折线图
plt.legend() # 显示上面的label
plt.rcParams[‘font.sans-serif’] = [‘KaiTi’] # 指定默认字体
plt.title(’{}各城市随时间的pm2.5平均值的变化’.format(",".join(didian)))
plt.xlabel(‘2018年12月份的日期’)
plt.ylabel(‘pm2.5的平均值’)
plt.show() #展示图像
结果截图:
用柱线混合图形画出合肥市的高新区和庐阳区的pm2.5的值。要求将输出的折线图保存成图像文件,X轴表示时间,柱状表示高新区 的pm2.5的值,线形表示庐阳区的pm2.5的值。
要求: 图形中含有图例
代码文件:
import numpy as np
from matplotlib import pyplot as plt
txt=open(“airpm25.txt”, encoding=‘utf8’)
a = np.loadtxt(txt, dtype=np.str, delimiter=’,’) # load 时也要指定为逗号分隔
juti = [“高新区”,“庐阳区”]
suju=[]
for dd in juti:
yao1 = np.where(a[…,2]==“合肥”)#选择地点是合肥的数据
yao2 = np.where(a[yao1][…,3] == dd)
shijian = np.unique(a[yao1][yao2][…,0])#将上述数据中的时间提取出来,并且去重,存入时间的列表
shijian_zhi =[]#用于记录这一个地点的数据
for x in np.nditer(shijian):
yao = np.where(a[yao1][yao2][…,0] == x)#从时间的列表中选择对应时间的数据,
b = np.array(a[yao1][yao2][yao][…, 1], dtype=np.int32)#将这一天所有的数据汇总成一个numpy数组,指定数据类型是数字
zhi = np.mean(b)#求平均值
shijian_zhi.append(zhi)
suju.append([shijian.tolist(),shijian_zhi])
print(suju)
def fx(x):
return x[-2:]
#x轴 y轴的数据一起组成了要绘制出的图形
plt.plot(list(map(fx, suju[1][0])), suju[1][1],color = ‘red’, label=juti[1]) # 传入x和y 通过plot绘制出折线图
plt.bar(list(map(fx, suju[0][0])), suju[0][1], label=juti[0]) # 传入x和y 通过plot绘制出折线图
plt.legend() # 显示上面的label
plt.rcParams[‘font.sans-serif’] = [‘KaiTi’] # 指定默认字体
plt.title(‘合肥市{}随时间的pm2.5平均值的变化’.format(",".join(juti)))
plt.xlabel(‘2018年12月份的日期’)
plt.ylabel(‘pm2.5的平均值’)
plt.show() #展示图像
结果截图:
【Python+Flask+Echarts】可视化练习题 ---- 2018年12月份1号-10号全国大部分城市的站点PM2.5检测
可视化练习题 ---- 2018年12月份1号-10号全国大部分城市的站点PM2.5检测
近些年空气污染在我国很多地区非常严重,其中PM2.5作为衡量空气质量的一个重要指标,当前数据为2018年12月份1号-10号全国大部分城市的站点检测数据。接下来我们将这些数据进行可视化来看下PM2.5的分布情况。
数据连接:https://pan.baidu.com/s/1ox8Y77OPVFK20LAGX3CesA
提取码:cvx1
一、柱状图输出合肥、黄山、芜湖的PM2.5指数
数据预处理
import pandas as pd
import numpy as np
from flask import Flask,render_template
#利用柱状图输出合肥、黄山、芜湖的PM2.5指数,Y轴表示PM2.5的平均数,X轴表示城市名称
#1.读取数据
data = pd.read_csv(r"G:\Projects\pycharmeProject-C\Flask\dataset\airpm25.txt",sep=",",names=[‘日期’,‘pm’,‘城市’,‘地区’])
print(data.dtypes)
print(data.isnull().sum()) # 检查空值
#2.提取有效信息
def city_info(city):
data_city = data.loc[data[‘城市’]==city,:]
result = data_city[‘pm’].mean() # 获取pm均值
return result
hefei = city_info(“合肥”) # 提取合肥信息
huangshan = city_info(“黄山”) # 提取黄山信息
wuhu = city_info(“芜湖”) # 提取芜湖信息
list = [hefei, huangshan, wuhu] # 合并信息
names = [“合肥”,“黄山”,“芜湖”]
可视化Flask框架
app = Flask(name) # 实例化
@app.route("/") # 构建视图
def index():
return render_template(“airpm2501_柱状图.html”,sheet = list,name_list = names)
if name == ‘main’:
app.run(debug=True) # 运行
HTML前端渲染
二、折线图绘制合肥、黄山、芜湖的PM2.5平均值的变化
数据预处理
import numpy as np
import pandas as pd
from flask import Flask,render_template
#用折线图,画出合肥、黄山、芜湖各城市随时间的pm2.5平均值的变化要求将输出的折线图保存成图像文件,Y轴表示pm2.5的平均值,X轴表示日期
#1.读取数据
data = pd.read_csv(r"G:\Projects\pycharmeProject-C\Flask\dataset\airpm25.txt",sep=",",names=[‘日期’,‘pm’,‘城市’,‘地区’])
2.转换日期格式
data[‘日期’] = [item[0:4]+"-"+item[4:6]+"-"+item[6:8] for item in data[“日期”].astype(“str”)] # 首先转化日期数据格式
data[‘day’] = [item.split("-")[2] for item in data[“日期”]]
#提取日期信息 — 几号
days = data[‘day’].drop_duplicates().values.tolist()
citys = [“合肥”,“黄山”,“芜湖”]
#定义方法获取每周的信息
def catch():
city_data = []
for city in citys: # 遍历城市
day_data = []
for day in days: # 遍历日期
data_info = data.loc[data[‘day’]== day,:] # 提取对应天数信息
data_info = data_info.loc[data[‘城市’] == city,:] # 提取对应城市信息
pm_mean = data_info[‘pm’].mean() # 求取对应城市某一月的pm均值
day_data.append([day,city,pm_mean])
city_data.append(day_data)
return city_data
city_data = catch()
可视化Flask框架
app = Flask(name)
@app.route("/")
def index():
return render_template(“airpm2502_折线图.html”,sheet = city_data)
if name == ‘main’:
app.run(debug=True)
HTML渲染
三、柱线混合图形画出合肥市的高新区和庐阳区的pm2.5的值。
数据预处理
import numpy as np
import pandas as pd
from flask import Flask,render_template
#用柱线混合图形画出合肥市的高新区和庐阳区的pm2.5的值。要求将输出的折线图保存成图像文件,X轴表示时间,柱状表示高新区 的pm2.5的值,线形表示庐阳区的pm2.5的值。
#1.读取数据
data = pd.read_csv(r"G:\Projects\pycharmeProject-C\Flask\dataset\airpm25.txt",sep=",",names=[‘日期’,‘pm’,‘城市’,‘地区’])
#2.转换日期格式
data[‘日期’] = [item[0:4]+"-"+item[4:6]+"-"+item[6:8] for item in data[“日期”].astype(“str”)] # 首先转化日期数据格式
data[‘day’] = [item.split("-")[2] for item in data[“日期”]]
#提取日期信息 — 几号
days = data[‘day’].drop_duplicates().values.tolist()
areas = [“高新区”,“庐阳区”]
#定义方法获取区域信息
def catch():
area_data = []
for area in areas:
for day in days:
dataa = data.loc[data[‘地区’] == area, :] # 获取对应地区信息
datab = dataa.loc[data[‘城市’] == “合肥”, :] # 获取对应城市信息
datac = datab.iloc[:, 1:].values.tolist() # 转变数据形式 — 利于传输
area_data.append(datac)
return area_data
area_data = catch()
可视化Flask框架
#可视化
app = Flask(name)
@app.route("/")
def index():
return render_template(“airpm2503_折柱混合图.html”, sheet=area_data)
if name == ‘main’:
app.run(debug=True)
HTML渲染
IDEA安装HADOOP插件
IDEA2020.2 连接HDFS直接settings->plugins-安装插件 big data tools ;重启IDEA
编写MR时添加配置项:
configuration.set(“dfs.client.use.datanode.hostname”, “true”);
configuration.set(“fs.defaultFS”, “hdfs://hadoop000:9000”);
IDEA spark依赖
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spark.version>2.3.1</spark.version>
<scala.version>2.11</scala.version>
常用数据分析Hive SQL应用专题赛
一、初始化环境
本次环境为单节点伪集群环境,环境中已经安装JDK1.8、Hadoop2.7.7、Mysql5.7、hive2.3.4。
1.环境中已经安装/root/software/hadoop-2.7.7,格式化HDFS,开启集群,查看集群状态。(HDFS端口为9000,其他端口默认)
2.环境中已经安装/root/software/apache-hive-2.3.4-bin,需要开启mysql服务,初始化数据库,即可开启Hive客户端。
格式化并启动集群(0 / 200分)
1.环境中已经安装Hadoop2.7.7,格式化HDFS,开启集群,查看集群状态。(HDFS端口为9000,其他端口默认)
2.环境中已经安装Hive2.3.4,需要开启mysql服务,初始化数据库,即可开启Hive客户端。
考核条件如下:
- 格式化集群(0.00 / 50分)
- 启动集群(0 / 50分)
- 开启mysql服务(0 / 50分)
- 格式化Hive元数据库,进入Hive客户端(0 / 50分)
导入人口数据
创建表:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type
[COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)]
INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
Hive不支持一条一条的用insert语句进行插入操作,也不支持update的操作。数据是以load的方式,加载到建立好的表中。数据一旦导入,则不可修改。要么drop掉整个表,要么建立新的表,导入新的数据。
导入数据:
LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 …)]
本数据为某人口普查公开数据数据库抽取而来,该数据集类变量为年收入是否超过50k$,属性变量包含年龄、工作类型、教育程度等属性,统计对各因素对收入的影响。
数据地址:/college/person.csv
数据变量如下:
字段 类型 说明
age double 年龄
workclass string 工作类型
fnlwgt string 可代表的人数
edu string 教育程度
edu_num double 受教育时间
marital_status string 婚姻状况
occupation string 职业
relationship string 关系
race string 种族
sex string 性别
gain string 资本收益
loss string 资本损失
hours double 每周工作时长
native string 原籍
income string 收入
示例数据:
66,Federal-gov,47358,10th,6,Married-civ-spouse,Craft-repair,Husband,White,Male,3471,0,40,United-States,<=50K
考核条件如下: - hive中创建person数据库,并在person数据库下创建person外部表(0.00 / 50分)
- 向person外部表中加载本地数据“/root/college/person.csv”,注意字段类型,自行定义(0 / 50分)
简单查询
select完整格式
完整格式如下:
select
[distinct] 字段名from 表名where 查询条件group by 分组字段having 筛选条件order by 排序字段limit 限制条件
查询顺序为:
from – 拿到表的数据
where – 对根据条件表数据进行筛选
group by – 根据某个字段进行分组
having – 对分组之后的数据进行再次筛选
order by – 对数据排序(排序不止有order by)
limit – 限制数据条数
distinct – 对数据去重
– 执行聚合函数对结果进行聚合select – 查询的结果(select结果的本质是一张虚拟表)
简单查询(Count、Max、Min、Groupby)(0 / 300分)
1.使用count函数统计表中所有数据。
2.使用max函数求最大
3.使用min函数求最小
4.根据sex性别列分组,再使用avg函数求取每组下的平均年龄,并使用round函数进行四舍五入
5.区间比较: between and
考核条件如下:
- 统计表中数据总条数,将结果写入本地/root/person00/。
(0.00 / 50分) - 求person表中年龄最大的人,将结果写入本地/root/person01/。
(0 / 50分) - 求person表中年龄最小的人,将结果写入本地/root/person02/。
(0 / 50分) - 根据性别求取person表中男女平均年龄,并进行四舍五入,将结果写入本地/root/person03/。
(0 / 50分) - 统计年龄为35岁至40岁且婚姻状况是“Never-married”(未婚)人的总数,将结果写入本地/root/person04/。
(0 / 50分) - 求取每周工作时长为20至30小时且职业是“Tech-support”(技术支持)的人员总数,将结果写入本地/root/person05/。
(0 / 50分)
TopK、排序数据分析
-
全局排序( order by)
Order By:全局排序,一个Reducer
ASC(ascend): 升序(默认)
DESC(descend): 降序
ORDER BY子句在SELECT语句的结尾 -
内部排序(Sort By)
Sort By:每个Reducer内部进行排序,对全局结果集来说不是排序。一般结合的是Distributed by使用
sort by 是单独在各自的reduce中进行排序,所以并不能保证全局有序,一般和distribute by 一起执行,而且distribute by要写在sort by前面。
如果mapred.reduce.tasks=1和order by效果一样,如果大于1会分成几个文件输出每个文件会按照指定的字段排序,而不保证全局有序。
3.Group By语句
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。
TopK、排序数据分析
(0 / 150分)
注意:
为防止大数据集群稳定性,类似非全等join(非inner join)是禁止的,禁用了SemanticException笛卡尔产品。
FAILED: SemanticException Cartesian products are disabled for safety reasons. If you know what you are doing, please sethive.strict.checks.cartesian.product to false and that hive.mapred.mode is not set to ‘strict’ to proceed. Note that if you may get errors or incorrect results if you make a mistake while using some of the unsafe features.
以下步骤为设置Hive支持笛卡尔积:
首先查看hive.strict.checks.cartesian.product。
set hive.strict.checks.cartesian.product;
设置hive.strict.checks.cartesian.product为false,表示支持笛卡尔积。
set hive.strict.checks.cartesian.product=false;
考核条件如下:
- 统计person表中各种族(race)的总人数,并按照总人数倒序排序,将结果写入本地/root/person06/。
(0.00 / 50分) - 统计不同职业薪资大于50K的总人数,且人数按照降序排序取Top3,将结果写入本地/root/person07/。
(0 / 50分) - 计算较高收入(收入等于大于50K的为高收入)人群占整体数据的比例(保留两位小数),注意:设置支持笛卡尔积参考步骤说明,将结果写入本地/root/person08/。
(0 / 50分)
Hive DDL基础操作
DML(Data Manipulation Language) 数据操纵语言:主要用来对数据库的数据进行一些操作,常用的就是INSERT、UPDATE、DELETE。
DDL(Data Define Language) 数据定义语言:常用的有CREATE和DROP,用于在数据库中创建新表或删除表,以及为表加入索引等
DCL(Data Control Language) 数据控制语言:通过GRANT和REVOKE,确定单个用户或用户组对数据库对象的访问权限
hiveDDL操作:
hive数据类型
hive数据编码
hive数据类型转换
hive创建数据库
hive创建表(三种方式)
hive表修改
hive内部表和外部表
hive表压缩格式
Hive DDL基础操作
Hive DDL基础操作
数据表字段:
字段 类型 说明
Id Int ID唯一标识
Name string 姓名
Age Int 年龄
Sex string 性别
考核条件如下:
- 在person数据库下创建student内部表(表结构参考步骤描述),并指定以制表符“\t”分隔;(0.00 / 50分)
- 使用alter语句修改student内部表结构新增一列字段名称为“address”,类型为“string”;
(0 / 50分) - 使用drop语句删除student内部表。(0 / 50分)
在linux系统中安装VSCode(Visual Studio Code)
1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make)
访问Visual Studio Code官网 https://code.visualstudio.com/docs?dv=linux64
我是64位的:
wget https://az764295.vo.msecnd.net/stable/7ba55c5860b152d999dda59393ca3ebeb1b5c85f/code-stable-code_1.7.2-1479766213_amd64.tar.gz
yum install libXScrnSaver
2.解压 ,如果文件名不对,可能解压不出来的(扩展名:tar.gz)
tar -zxvf code-stable-code_1.7.2-1479766213_amd64.tar.gz
3.然后移动到 /usr/local/ 目录
mv VSCode-linux-x64 /usr/local/
4.可能还需要给可执行的权限, 然后就已经可以运行了
chmod +x /usr/local/VSCode-linux-x64/code
5.复制一个VScode图标文件到 /usr/share/icons/ 目录(后面会有用)
cp /usr/local/VSCode-linux-x64/resources/app/resources/linux/code.png /usr/share/icons/
6.创建启动器, 在/usr/share/applications/ 目录, 也可以将它复制到桌面目录
直接在中断 使用 命令:
vim /usr/share/applications/VSCode.desktop
然后输入以下文本:
[Desktop Entry]
Name=Visual Studio Code
Comment=Multi-platform code editor for Linux
Exec=/usr/local/VSCode-linux-x64/code
Icon=/usr/share/icons/code.png
Type=Application
StartupNotify=true
Categories=TextEditor;Development;Utility;
MimeType=text/plain;
保存后退出, 然后可以复制到桌面:
cp /usr/share/applications/VSCode.desktop /home/hadoop/Desktop
之后 就会发现 桌面和 应用程序菜单都有了 VSCode的快捷方式了
Centos7安装Python3.7
说明
全部操作都在root用户下执行
1.安装编译相关工具
yum -y groupinstall “Development tools”
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
yum install libffi-devel -y
2.下载安装包解压
cd #回到用户目录
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
tar -xvJf Python-3.7.0.tar.xz
3.编译安装
mkdir /usr/local/python3 #创建编译安装目录
cd Python-3.7.0
./configure --prefix=/usr/local/python3
make && make install
4.创建软连接
ln -s /usr/local/python3/bin/python3 /usr/local/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
5.验证是否成功
python3 -V
pip3 -V
或者,如果您使用 pip3 安装笔记本:
python3 -m notebook --allow-root
切换到非图形界面:ctrl+alt+f6
切到图形界面:startx