使用Spark探索数据

需求分析

使用Spark来探索数据是一种高效处理大规模数据的方法,需要对数据进行加载、清洗和转换,选择合适的Spark组件进行数据处理和分析。需求分析包括确定数据分析的目的和问题、选择合适的Spark应用程序和算法、优化数据处理流程和性能、可视化和解释分析结果。同时,需要熟悉Spark的基本概念和操作,掌握Spark编程和调优技巧,以确保数据探索的准确性和效率。

系统实现

了解实验目的

掌握python on Spark的使用理解探索数据的意义和方法,掌握使用Spark探索数据的过程。

1.实验整体流程分析:

  • 准备环境,安装Hadoop和Spark组件
  • 准备数据,采用开源movielens数据集
  • 探索用户数据
  • 探索电影数据
  • 探索电影评级数据

 2.准备数据:

  • 打开终端,启动Hadoop和Spark集群

  • 下载相关数据集

  • 将数据集解压到/usr/目录下

  • 上传数据至HDFS
# hadoop fs -mkdir /data
# hadoop fs -ls /
# hadoop fs -put /usr/data/u.user /data/u.user
# hadoop fs -put /usr/data/u.data /data/u.data
# hadoop fs -put /usr/data/u.genre /data/u.genre
# hadoop fs -put /usr/data/u.info /data/u.info
# hadoop fs -put /usr/data/u.item /data/u.item
# hadoop fs -put /usr/data/u.occupation /data/u.occupation
# hadoop fs -ls /data

上传后的HDFS的data目录结构如图所示

3.探索用户数据:

  • 打开终端,执行pyspark命令,进入Spark的python环境

  • 打印首行记录

运行结果如下

  • 分别统计用户、性别和职业的个数
# 以' | '切分每列,返回新的用户RDD
user_fields = user_data.map(lambda line: line.split("|"))
# 统计用户数
num_users = user_fields.map(lambda fields: fields[0]).count()
# 统计性别数
num_genders = user_fields.map(lambda fields: fields[2]).distinct().count()
# 统计职业数
num_occupations = user_fields.map(lambda fields: fields[3]).distinct().count()
# 统计邮编数
num_zipcodes = user_fields.map(lambda fields: fields[4]).distinct().count()
# 返回结果
print ("用户数: %d, 性别数: %d, 职业数: %d, 邮编数: %d" % (num_users, num_genders, num_occupations, num_zipcodes))

运行结果如下

  • 查看年龄分布情况,并用plt.show绘制

  • 查看职业分布情况,同样绘制图
# 并行统计各职业人数的个数,返回职业统计RDD后落地
count_by_occupation = user_fields.map(lambda fields: (fields[3], 1)).reduceByKey(lambda x, y: x + y).collect()
# 生成x/y坐标轴
x_axis1 = np.array([c[0] for c in count_by_occupation])
y_axis1 = np.array([c[1] for c in count_by_occupation])
x_axis = x_axis1[np.argsort(x_axis1)]
y_axis = y_axis1[np.argsort(y_axis1)]
# 生成x轴标签
pos = np.arange(len(x_axis))
width = 1.0
ax = plt.axes()
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(x_axis)
# 绘制职业人数条状图
plt.xticks(rotation=30)
plt.bar(pos, y_axis, width, color='lightblue')
plt.show()

 

  • 统计各职业人数

4.探索电影数据:

  • 重新打开终端,执行pyspark命令,进入Spark的python环境

  • 打印首行记录

  • 查看电影的数量

  • 过滤掉没有发现时间信息的记录

注意,输入时需要手动缩进

  • 查看影片的年龄分布并绘图

5.探索评级数据:

  • 重新打开终端,进入Spark的bin目录下,执行pyspark命令,进入Spark的python环境

  • 打印首行记录

  • 查看有多少人参与了评分

  • 统计最高、最低、平均、中位评分,以及平均每个用户的评分次数
# 以' | '切分每列,返回新的用户RDD
user_fields = user_data.map(lambda line: line.split("|"))
# 统计用户数
num_users = user_fields.map(lambda fields: fields[0]).count()
# 获取电影数量
num_movies = movie_data.count()
# 获取评分RDD
rating_data = rating_data_raw.map(lambda line: line.split("\t"))
ratings = rating_data.map(lambda fields: int(fields[2]))
# 计算最大/最小评分
max_rating = ratings.reduce(lambda x, y: max(x, y))
min_rating = ratings.reduce(lambda x, y: min(x, y))
# 计算平均/中位评分
mean_rating = ratings.reduce(lambda x, y: x + y) / float(num_ratings)
median_rating = np.median(ratings.collect())
# 计算每个观众/每部电影平均打分/被打分次数
ratings_per_user = num_ratings / num_users
ratings_per_movie = num_ratings / num_movies
# 输出结果
print("最低评分: %d" % min_rating)
print("最高评分: %d" % max_rating)
print("平均评分: %2.2f" % mean_rating)
print("中位评分: %d" % median_rating)
print("平均每个用户打分(次数): %2.2f" % ratings_per_user)
print("平均每部电影评分(次数): %2.2f" % ratings_per_movie)

  • 统计评分分布情况
# 生成评分统计RDD,并落地
count_by_rating = ratings.countByValue()
# 生成x/y坐标轴
x_axis = np.array(count_by_rating.keys())
y_axis = np.array([float(c) for c in count_by_rating.values()])
# 对人数做标准化
y_axis_normed = y_axis / y_axis.sum()
# 生成x轴标签
pos = np.arange(len(y_axis))
width = 1.0
ax = plt.axes()
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(y_axis)
# 绘制评分分布柱状图
plt.bar(pos, y_axis_normed, width, color='lightblue')
plt.xticks(rotation=30)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 简约又简单的加载动画 第七季 音量柱风格

今天和大家分享两个音量柱风格的加载动画,这次的加载动画的最大特点就是简单,只有几行代码. 效果如下: 一共三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc…

【一竞技】DOTA2-梦幻联赛S22:XG战队 2-1击败 Spirit

在3月1日晚上进行的梦幻联赛第二阶段小组赛上,XG 战队以2-1 击败Spirit战队。双方对阵第三场决胜局:XG前中期优势,冰连续控盾压制最终拿下了比赛胜利,以下是对决战报。 XG战队在天辉,阵容是小狗、火女、人马、墨客、凤凰。Spirit战队在夜魇,阵容是斯温、火枪、龙骑、白虎、飞机…

14.最长公共前缀

题目&#xff1a;编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串""。 解题思路&#xff1a;横向扫描&#xff0c;依次遍历每个字符串&#xff0c;更新最长公共前缀。另一种方法是纵向扫描。纵向扫描时&#xff0c;从前…

Windows命令行工具和PowerShell介绍

Windows命令行工具和PowerShell是两种不同的文本界面命令解释器&#xff0c;它们在Windows操作系统中用于执行各种操作和管理任务。虽然它们都可以用于执行命令和脚本&#xff0c;但它们之间存在着一些区别和特点。 1. Windows命令行工具&#xff08;Cmd.exe&#xff09; …

Flutter开发之CupertinoApp

Flutter开发之CupertinoApp 最近由于使用Flutter编程更多&#xff0c;使用Flutter更顺手&#xff0c;相对于其他前端框架来说&#xff0c;Flutter在跨平台、响应式UI、自绘引擎、即插即用的组件和庞大的社区生态支持方面有更大的优势&#xff1b;Flutter拥有更低的学习成本&am…

elegentbook模板不生成目录的解决方法

这里只有目录两个字、却没有生成目录 在json里面修改 "latex-workshop.latex.autoClean.run": "onBuilt",把onBuilt改为onFailed即可 "latex-workshop.latex.autoClean.run": "onFailed",

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…

idea中maven配置(一次成功,全部细节都有)

写这篇文章的原因是maven的配置很简单&#xff0c;但是也很容易出错&#xff0c;我连配了两台电脑的maven出现了各种小错误&#xff0c;参考了以下两篇博文IDEA配置Maven教程&#xff08;超详细版~)_idea maven配置教程-CSDN博客 一次包会——最新IDEA配置Maven指南&#xff0…

Oracle dbms_output基本使用2

以前曾使用过Oracle dbms_output&#xff0c;继续熟悉&#xff1b; 执行如下一句&#xff0c;报告错误&#xff0c; 必须放到begin...end里面&#xff1b; 上图也没有把文字输出&#xff0c;因为默认没有开启控制台显示&#xff1b;如下图就输出了文字&#xff0c; put&#x…

python:pyecharts 画基金净值 月K线图

pip install pyecharts1.9.1 pyecharts-1.9.1-py3-none-any.whl 我想在本地&#xff08;PC) 画出 基金净值 月K线图&#xff0c;不想每次看图都需联网。 cd my_dir mkdir echarts cd echarts curl -O https://assets.pyecharts.org/assets/echarts.min.js 修改一下开源代码 …

设计模式——中介者模式(mediator pattern)

概述 如果在一个系统中对象之间的联系呈现为网状结构&#xff0c;如下图所示。对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂&#xff0c;这些对象既会影响别的对象&#xff0c;也会被别的对象所影响&#xff0c;这些对象称为同事对象&#xff0c;它们之间通过彼…

怎样才算是软件测试中搭建测试环境?

测试环境是QA做好检测运行的前提条件。平稳和可控的测试环境&#xff0c;能够使测试人员在实行测试用例时不用花费额外的时间去维护。有一些企业运维或是研发部会帮忙准备好测试环境&#xff0c;可是QA要是一味依赖别的部门&#xff0c;会局限检测运行的做好。 一、什么是测试…

游戏科技:超越娱乐的界限

12月25日&#xff0c;国家新闻出版署在节日前夕推出令业内人士振奋的好消息——本次共有105款国产网络游戏通过审批&#xff0c;获得版号&#xff0c;这不仅数量超过了历史新高&#xff0c;更使业内人士看到政策回暖的希望。 这105款游戏覆盖多家知名游戏企业&#xff0c;其中不…

vue3+vite 项目的创建

这里要提醒一下&#xff0c;如果我们要使用 vue3 的组合式api 的写法的话&#xff0c; 那么我们使用的 vue 版本不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本 vue2 已停止维护了&#xff0c; 现在全面拥抱vue3 之前用 vue-cli 创建…

线程池学习

github看到一个项目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服务器&#xff09;&#xff0c;内部使用的一个线程池看着不错&#xff0c;拿来学习一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

计算机服务器中了mallox勒索病毒怎么解密,mallox勒索病毒解密流程

科技技术的第一生产力&#xff0c;网络技术的不断发展与应用&#xff0c;让企业逐步走向数字化时代&#xff0c;通过网络的力量可以为企业更好地开展各项业务工作&#xff0c;网络数据安全问题也由此成为众多企业关心的主要话题。近日&#xff0c;云天数据恢复中心接到某化工集…

PL/SQL执行.sql文件

1.编写.sql文件&#xff0c;创建update.sql文件&#xff0c;文件如下&#xff1a; set feedback off set define off --更新表中所有人的年龄 update a set age18; prompt Done. 2.打开plsql选择命令窗口&#xff0c;即选择File->New->Command Window&#xff1b; 打…

SpringBoot系列(一):SpringBoot介绍

SpringBoot系列(一)&#xff1a;SpringBoot介绍 1. SpringBoot介绍 SpringBoot是由Pivotal团队提供的一套用于构建微服务的基础框架&#xff0c;它旨在简化Spring应用程序的创建和开发过程。 SpringBoot通过设计大量的自动化配置等方式来简化Spring原有样板化的配置&#xff…

开发规范(黑马学习笔记)

开发规范我们主要从以下几方面介绍&#xff1a; 开发规范-REST 我们的案例是基于当前最为主流的前后端分离模式进行开发。 在前后端分离的开发模式中&#xff0c;前后端开发人员都需要根据提前定义好的接口文档&#xff0c;来进行前后端功能的开发。 后端开发人员&#xff1…

【精通Spring】基于注解管理Bean

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…