基于Spark SQL的数据探索
⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计9695字,阅读大概需要10分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
⏰个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
一、实验目的
掌握Spark SQL的探索性数据分析技术。
二、实验内容
1、进行探索性数据分析。
2、探索性数据可视化。
3、对数据进行采样。
4、创建数据透视表。
三、实验原理
Exploratory Data Analysis (EDA),或Initial Data Analysis (IDA),是一种数据分析方法,试图最大限度地洞察数据。这包括评估数据的质量和结构,计算汇总或描述性统计,以及绘制适当的图表。它可以揭示底层结构,并建议如何建模数据。此外,EDA帮助我们检测数据中的异常值、错误和异常,并且决定如何处理这些数据通常比其他更复杂的分析更重要。EDA使我们能够测试我们的基本假设,发现数据中的集群和其他模式,并识别各种变量之间可能的关系。仔细的EDA过程对于理解数据是至关重要的,而且有时足以揭示如此糟糕的以至于使用更复杂的基于模型的分析是不合理的数据质量。
在Spark SQL中,DataFrame上定义有一个summary()函数。这个函数将返回DataFrame中一列数值的记录的数量(count)、均值(mean)、标准差(stdev)、最小值(min)、最大值(max)。
四、实验环境
硬件:x86_64 ubuntu 16.04服务器
软件:JDK 1.8,Spark-2.3.2,Hadoop-2.7.3,zeppelin-0.8.1
五、实验步骤
5.1 启动HDFS集群、Spark集群和Zeppelin服务器
在终端窗口下,输入以下命令,分别启动HDFS集群、Spark集群和Zeppelin服务器:
1. $ start-dfs.sh
2. $ cd /opt/spark
3. $ ./sbin/start-all.sh
4. $ zeppelin-daemon.sh start
然后使用jps命令查看进程,确保已经正确地启动了HDFS集群、Spark集群和Zeppelin服务器。
5.2 准备实验数据
将本地数据上传至HDFS上。在终端窗口中,分别执行以下命令上传数据:
1. $ hdfs dfs -mkdir -p /data/dataset/
2. $ hdfs dfs -put /data/dataset/batch/chuangxin.csv /data/dataset/
3. $ hdfs dfs -put /data/dataset/bank-full.csv /data/dataset/
执行以下命令,查看数据文件是否已经上传到HDFS中:
1. $ hdfs dfs -ls /data/dataset/
5.3 进行探索性数据分析
在探索性数据分析中,我们研究给定的数据。研究数据意味着统计记录的数量,然后寻找有意义的模式。
1、创建notebook。启动浏览器,访问”http://localhost:9090“, 打开zeppelin notebook首页。点击”Create new note”链接,创建一个新的笔记本,命名为”analy_demo”,如下图所示:
2、 加载数据。在zeppelin中输入如下代码:
1. // 加载数据到DataFrame
2. val filePath = "hdfs://localhost:9000/data/dataset/chuangxin.csv"
3. val df1 = spark.read.option("header","true").option("inferSchema","true").csv(filePath)
4.
5. // 查看schema
6. df1.printSchema
7.
8. // 查看前5条数据
9. df1.show(5)
同时按下”【Shift + Enter】”键,执行以上代码。可以看到如下的输出内容:
3、 统计总共有多少条记录。在zeppelin中执行如下代码:
1. // 统计总共有多少条记录
2. df1.count
同时按下”【Shift + Enter】”键,执行以上代码。可以看到如下的输出内容:
可以看出,这个数据集中总共有1525条记录。
4、 识别缺失值。在zeppelin中执行如下代码:
1. // 识别缺失值:分析样本数据集中缺少数据字段的记录数量
2. df1.groupBy("SQJE").count().show
3. df1.groupBy("FFJE").count().show
同时按下”【Shift + Enter】”键,执行以上代码。可以看到如下的输出内容:
在这里,我们分别对”SQJE”(申请金额)列和”FFJE”(发放金额)列进行判断,看这两列是否有缺失值。从结果可以看出,”SQJE”列没有缺失值,而”FFJE”列有一个缺失值。
5、 找出有缺失值的记录。在zeppelin中执行如下代码:
1. df1.where($"FFJE".isNull).show
2. // df1.filter