PySpark处理数据并图表分析

PySpark处理数据并图表分析

PySpark简介

  1. 官方对PySpark的释义为:“PySpark is the Python API for Spark”。 也就是说pyspark为Spark提供的Python编程接口。
  2. Spark使用py4j来实现python与java的互操作,从而实现使用python编写Spark程序。Spark也同样提供了pyspark,一个Spark的python shell,可以以交互式的方式使用Python编写Spark程序。 如:

    from pyspark import SparkContext
    sc = SparkContext("local","Job Name", pyFiles=['MyFile.py', 'lib.zip', 'app.egg'])
    words =sc.textFile("/usr/share/dict/words")
    words.filter(lambda w:w.startswith("spar")).take(5)

PySpark文档主页界面:

PySpark是构建在Java API之上的,如下图:

处理数据并图表分析

下面我通过PySpark对真实的数据集进行处理,并作图形来分析。首先我需要介绍下数据集以及数据处理的环境。

数据集

MovieLens数据集是由Minnesota大学的GroupLens Research Project对电影评分网站(movielens.umn.edu)收集的,数据集包含了1997年9月19日到1998年四月22日间共七个月的数据。这些数据已经被处理过了(清除了那些评分次数少于20次以及信息没有填写完整的数据)

MovieLens数据集:

MovieLens数据集,用户对自己看过的电影进行评分,分值为1~5。MovieLens包括两个不同大小的库,适用于不同规模的算法.小规模的库是943个独立用户对1682部电影作的10000次评分的数据(我是用这个小规模作数据处理和分析);通过对数据集分析,为用户预测他对其他未观看的电影的打分,将预测分值高的电影推荐给用户,认为这些电影是用户下一步感兴趣的电影。

数据集结构:

1、943个用户对1682场电影评分,评判次数为100000次,评分标准:1~5分。

2、每位用户至少评判20场电影。

3、简单地统计了用户的一些信息 (age, gender, occupation, zip)

数据用途:

供科研单位和研发企业使用,可用于数据挖掘、推荐系统,人工智能等领域,复杂网络研究等领域。

数据处理的环境

  1. Hadoop伪分布环境
  2. Spark Standalone环境
  3. Anaconda环境:(下载地址:https://www.continuum.io/downloads)
  4. Anaconda Python 是 Python 科学技术包的合集,包含超过400个流行的科学计算、数学、工程以及数据分析用的包。这里我主要是用它的一些包,免得自己装一些Python包麻烦。

其他:

处理一(用户年龄统计分析)

处理一简介:

通过对用户数据处理,获得用户信息中的年龄。然后对年龄进行统计并使用Python中的图形框架Matplotlib生成柱状图,最后通过柱状图分析观看电影的观众年龄分布趋势。

处理一所有代码:

#加载HDFS上面的用户数据
user_data = sc.textFile("hdfs:/input/ml-100k/u.user")
#打印加载的用户信息第一条
user_data.first()

#用"|"分割符分割每一行的数据,然后将数据返回到user_fields
user_fields = user_data.map(lambda line: line.split("|"))
#统计总的用户数
num_users = user_fields.map(lambda fields: fields[0]).count()
#统计性别的种类数,distinct()函数用来去重。
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 "Users: %d, genders: %d, occupations: %d, ZIP codes: %d" % (num_users, num_genders, num_occupations, num_zipcodes)

#统计用户年龄
ages = user_fields.map(lambda x: int(x[1])).collect()
#通过python中的matplotlib生成图表提供给分析师分析
import matplotlib.pyplot as plt
hist(ages, bins=20, color='lightblue', normed=True)
fig = plt.gcf()
fig.set_size_inches(16, 10)
plt.show()

进入Spark安装目录的,然后输入如下命令开启pyspark:

./bin/pyspark

之后加载HDFS上面的用户数据(u.user),然后通过user_data.first()打印第一条数据显示数据格式。

统计的HDFS上面的所有用户信息:总共943位用户、男女两种性别、21中职位、795个不同的邮政编码。

Matplotlib是一个Python的图形框架,下面为matplotlib工作过程的打印信息:

Matplotlib对统计后的数据图形化显示:

用户年龄分布图:

结论:

通过生成的柱状图我们可以看出这些电影观众年龄段趋于青年,并且大部分用户年龄都在15到35之间。

处理二(用户职位统计分析)

处理二简介:

首先对用户数据处理,获得用户信息中的职位种类以及每种职位用户个数。然后对职位进行统计并使用Python中的图形框架Matplotlib生成柱状图,最后通过柱状图分析观看电影的观众职位以及人数分布趋势。

处理二所有代码:

#处理职位那一列,通过类似于MapReduce经典例子WordCount处理过程处理职位
count_by_occupation = user_fields.map(lambda fields: (fields[3], 1)).reduceByKey(lambda x, y: x + y).collect()
#导入numpy模块
import numpy as np
#获取用户职位,并作为柱状图的x轴数据显示
x_axis1 = np.array([c[0] for c in count_by_occupation])
#获取用户的各个职位数,并作为y轴数据显示
y_axis1 = np.array([c[1] for c in count_by_occupation])
#让x轴类别的显示按照y轴中每种职位的个数升序排序
x_axis = x_axis1[np.argsort(y_axis1)]
#y轴也是升序
y_axis = y_axis1[np.argsort(y_axis1)]

#设置柱状图中x轴范围以及width
pos = np.arange(len(x_axis))
width = 1.0

#将统计的职位信息使用matplotlib生成柱状图
from matplotlib import pyplot as plt
ax = plt.axes()
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(x_axis)
plt.bar(pos, y_axis, width, color='lightblue')
plt.xticks(rotation=30)
fig = plt.gcf()
fig.set_size_inches(16, 10)
plt.show()

用户职位信息处理过程:

用户职位信息统计并生成柱状图:

用户职位分布图:

结论:

从最终生成的图表中,我们可以看出电影观众大部分都是student, educator, administrator, engineer和programmer。并且student的人数领先其他职位一大截。

处理三(电影发布信息统计分析)

处理三简介:

  1. 首先对用户数据处理,获得用户评价的电影发布时间信息。然后以1998年为最高年限减去电影发布的年限(数据集统计的时间为1998年)得到的值作为x轴,接着通过Python中的图形框架Matplotlib生成柱状图,最后通过柱状图分析当时电影发布时间趋势。
  2. 电影信息有一些脏数据,所以需要先作处理。

处理三所有代码:

#从HDFS中加载u.item数据
movie_data = sc.textFile("hdfs:/input/ml-100k/u.item")
#打印第一条数据,查看数据格式
print movie_data.first()

#统计电影总数
num_movies = movie_data.count()
print "Movies: %d" % num_movies

#定义函数功能为对电影数据预处理,对于错误的年限,使用1900填补
def convert_year(x):
    try:
        return int(x[-4:])
    except:
        return 1900 # there is a 'bad' data point with a blank year,which we set to 900 and will filter out later

#使用"|"分隔符分割每行数据
movie_fields = movie_data.map(lambda lines: lines.split("|"))
#提取分割后电影发布年限信息,并做脏数据预处理
years = movie_fields.map(lambda fields: fields[2]).map(lambda x:convert_year(x))
#获取那些年限为1900的电影(部分为脏数据)
years_filtered = years.filter(lambda x: x != 1900)
#计算出电影发布时间与1998年的年限差
movie_ages = years_filtered.map(lambda yr: 1998-yr).countByValue()

#将年限差作为x轴,电影数量作为y轴作柱状图
values = movie_ages.values()
bins = movie_ages.keys()
from matplotlib import pyplot as plt1
plt1.hist(values, bins=bins, color='lightblue', normed=True)
fig = plt1.gcf()
fig.set_size_inches(16,10)
plt1.show()

从HDFS上加载电影数据并打印第一条数据查看数据格式:

打印的电影数据格式:

打印的电影总数:

电影发布年限统计并生成柱状图:

电影发布年限分布图:(x轴为1998减去电影发布年限)

结论:

从最终生成的图表中,我们可以看出绝大多数电影发布时间都在1988-1998年之间。

处理四(用户评分统计分析)

处理四简介:

首先对用户数据处理,获得用户对电影的评分数,然后统计评分1-5的每个评分个数,然后绘制图表供分析。

处理四所有代码:

#从HDFS上面加载用户评分数据
rating_data = sc.textFile("hdfs:/input/ml-100k/u.data")
print rating_data.first()
#统计评分记录总数
num_ratings = rating_data.count()
print "Ratings: %d" % num_ratings

#使用"\t"符分割每行数据
rating_data = rating_data.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) / num_ratings
#获取评分中位数
median_rating = np.median(ratings.collect())
#每位用户平均评分
ratings_per_user = num_ratings / num_users
#每位用户评了几场电影
ratings_per_movie = num_ratings / num_movies
#打印上面这些信息
print "Min rating: %d" % min_rating
print "Max rating: %d" % max_rating
print "Average rating: %2.2f" % mean_rating
print "Median rating: %d" % median_rating
print "Average # of ratings per user: %2.2f" % ratings_per_user
print "Average # of ratings per movie: %2.2f" % ratings_per_movie

#获取评分数据
count_by_rating = ratings.countByValue()
import numpy as np
#x轴的显示每个评分(1-5)
x_axis = np.array(count_by_rating.keys())
#y轴显示每个评分所占概率,总概率和为1
y_axis = np.array([float(c) for c in count_by_rating.values()])
y_axis_normed = y_axis / y_axis.sum()
pos = np.arange(len(x_axis))
width = 1.0
#使用matplotlib生成柱状图
from matplotlib import pyplot as plt2
ax = plt2.axes()
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(x_axis)
plt2.bar(pos, y_axis_normed, width, color='lightblue')
plt2.xticks(rotation=30)
fig = plt2.gcf()
fig.set_size_inches(16, 10)
plt2.show()

从HDFS加载数据

评分记录总数:

评分的一些统计信息;

统计评分信息并生成柱状图:

用户电影评价分布图:

结论:

从图中我们可以看出电影的评分大都在3-5分之间。

处理五(用户总评分统计分析)

处理五简介:

首先对用户数据处理,获得用户对电影的总评分数(每位至少评价20次,评分在1-5之间)然后绘制图表供分析。

处理四所有代码:

#获取用户评分次数和每次评分
user_ratings_grouped = rating_data.map(lambda fields: (int(fields[0]),int(fields[2]))).groupByKey()
#用户ID以及该用户评分总数
user_ratings_byuser = user_ratings_grouped.map(lambda (k, v): (k,len(v)))
#打印5条结果
user_ratings_byuser.take(5)

#生成柱状图
from matplotlib import pyplot as plt3
user_ratings_byuser_local = user_ratings_byuser.map(lambda (k, v):v).collect()
plt3.hist(user_ratings_byuser_local, bins=200, color='lightblue',normed=True)
fig = plt3.gcf()
fig.set_size_inches(16,10)
plt3.show()

打印用户5条处理后的结果:

生成每位用户评分总数分布图:

结论:

从图中可以看出总评分在100以内的占了绝大多数。当然,100到300之间还是有一部分的。

注意事项

1、要显示Python图标,必须要操作系统有图形界面。

2、Python必要有matplotlib 模块。

3、必须要以root用户开启PySpark,不然会报以下错误,没有权限连接x Server。

时间: 2024-08-09 14:42:52

PySpark处理数据并图表分析的相关文章

使用ECharts实现数据图表分析

  一.ECharts介绍 实现对统计数据的图形分析之前用过JFreeChar,但它是用纯java实现编码繁琐且效果不佳,后来又使用过Fusioncharts 报表工具,它是基于Flash的图表组件.以XML为数据.提供丰富的Flash动画作为图标模板,实现简单效果不错但flash是老东西了且浏览器需要flash插件的支持,更关键的是手机端浏览器基本上不支持.最近看到百度提供一套ECharts(Enterprise Charts)商业产品图表库,它是基于ZReader(一个全新的轻量级canva

简单图表分析(2/2)

西蒙最近视力似乎有点疲劳过度,决定晚10:30睡觉,所以更博时间就改在早晨了.请各位包含,还有,今天上图怎么老是上不去~ ____ 算数平均分析(差异分析) 算数平均分析就是运用计算平均数的方法反映总体在一段时间.地点条件下.某一数量特征的一般水平.平均指标既可用于同一现象在不同地区.不同部门间的横向比较,也可以用于同一现象在不同时间的比较. 使用平均指标更能反映现象的持续能力或水平.比如网站的一个分站点,在某个时间段内的平均访问量. 算数平均数的计算方式为:总体各单位数值的总和/总体单位个数.

百度数据可视化图表套件echart实战

最近我一直在做数据可视化的前端工作,我用的最多的绘图工具是d3.d3有点像photoshop,功能很强大,例子也很多,但是学习成本也不低,做项目是需要较大人力投入的.3月底由在亚马逊工作的同学介绍下使用了一下echart,一个由百度前端发起的canvas国产类库(官网:http://echarts.baidu.com/index.html).这个echart其实是在canvas类库zrender的基础上做的主题图库,优点有数据驱动,图例丰富,功能强大,支持数据拖拽重计算,数据区域漫游,全中文文档

听云APP 图表分析

看见大量图表不知道如何入手,可以先从以下方面逐条分析,再综合总结找出问题原因.这些方面都是友盟所不具备的(事实上,两款监测SDK功能交叉的地方很少). 网络耗时 1.可以根据汇总HTTP 响应时间图表来查看 CDN 网络问题,通过IP来确定各个品牌既而分析时间. 2.可以监听HTTP首包和完整的请求耗时,了解对接的服务器主机的实时情况. 3.通过地域的响应时间图表分析,可以掌握网络在各个地区对APP的影响. 4.提供行业的各项参考数据,让我们了解我们在行业中得位置以及针对性的优化. 5.可以针对

支持XML和JSON数据的图表控件FusionCharts XT

FusionCharts XT是一款功能强大的图表控件,同时支持HTML5和Flash,可以用于PCs, Macs, iPads, iPhones ,支持XML和JSON数据,可以帮您为您的Web应用创建交互式的.数据驱动的图表.仪表盘和地图.它具有智能化.用户友好和创新等特点,可以将单调的数据转化为栩栩如生的图像,从而使您的Web应用更加的生动.它可以完美的应用于web应用软件.管理仪表板.分析学.展示和决策支持系统,可以与诸如ASP.ASP.NET.PHP.JSP.ColdFusion和Ru

简单图表分析(1/2)

频率分布分析: 频率分布主要用直方图进行分析(连续数据,离散数据使用散点图),直方图是一种显示数据分布情况的柱形图,即不同数据出现的频率.通过这些高度不同的柱形,可以直观.快速地观察数据的分散程度和中心趋势. 直方图适用于连续数据的分析,因此对数据量有一定的要求.如果数据量很少时,可以直接使用散点图进行展示. 上图:数据是否正态分布 上图:数据左倾还是右倾 上图:数据是否围绕某个值紧密聚集 上图:数据是否位于设定的限制中 相关性及数据分布分析: 对于相关性及数据分布分析,我们一般使用散点图进行分

OneAPM大讲堂 | 监控数据的可视化分析神器 Grafana 的告警实践

文章系国内领先的 ITOM 管理平台供应商 OneAPM 编译呈现. 概览 Grafana 是一个开源的监控数据分析和可视化套件.最常用于对基础设施和应用数据分析的时间序列数据进行可视化分析,也可以用于其他需要数据可视化分析的领域.Grafana 可以帮助你查询.可视化.告警.分析你所在意的指标和数据.可以与整个团队共享,有助于培养团队的数据驱动文化. Grafana 有强大的社区支持,有丰富的模板插件,足够满足需要的功能特性.几乎可以集成任何数据源.监控工具和告警平台.可谓是不可多得的神器.也

【数据分析 R语言实战】学习笔记 第五章 数据的描述性分析(上)

5.1R内置的分布 分布是描述一个样本数据最核心.最重要的方式.R内嵌了很多常用的统计分布,提供了四类函数:概率密度函数(density),累积分布函数(probability).分位数(quantile)和伪随机数(random).在R中分别用d,p,q,r表示这4个项目,后面接分布的英文名称或缩写. 5.2集中趋势的分析 5.2.1集中趋势的测度 描述统计分布集中趋势的指标主要是平均数.中位数.众数,也称为“平均指标”.这些指标的主要作用包括: 反映总体各单位变量分布的集中趋势和一般水平;

Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表. ECharts 3 中更是加入了更多丰富的交互功能以及更多的可视化效果,并且对移动端做了深度的优化.   1.npm