spark数据分析(sogou500w数据集)

1.实验环境

1.1操作系统

macOS Mojave 10.14.1

1.2虚拟化软件

VMware Fusion

1.3虚拟机操作系统

ubuntu18.04 64 位

1.4数据

sogou500w数据

2.实验步骤和方法流程

2.1安装jdk

前往官网下载jdk1.8,安装位置为/home/kyle/env。

2.1.2配置环境变量

vsudo vim /etc/profile

export JAVA_HOME=/home/kyle/env/java/jdk1.8
export JRE_HOME=JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH

source /etc/profile

查看是否安装成功: java -version

2.2安装hadoop

2.2.1安装ssh

sudo apt-get install ssh
sudo apt-get install rsync

2.2.2设置ssh免密登陆

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys

check免密登陆: ssh localhost

2.2.3配置hadoop环境

cd /home/kyle/app/hadoop
vim etc/hadoop/hadoop-env.sh

export JAVA_HOME=/home/kyle/env/jdk1.8

vim etc/hadoop/core-site.xml


 
 fs.defaultFS
 hdfs://localhost:9000
 

vim etc/hadoop/hdfs-site.xml


 
 dfs.replication
 1
 

cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
vim etc/hadoop/mapred-site.xml


 
 mapreduce.framework.name
 yarn
 

vim etc/hadoop/yarn-site.xml


 
 yarn.nodemanager.aux-services
 mapreduce_shuffle
 

2.2.4配置hadoop环境变量

sudo vim /etc/profile

export HADOOP_PATH=/home/kyle/app/hadoop
export PATH=$PATH:$HADOOP_PATH/bin:$HADOOP_PATH/sbin

source /etc/profile

2.2.5格式化hdfs文件系统

hdfs namenode -format

2.2.6打开查看关闭dfs和yarn

start-dfs.sh
start-yarn.sh
jps
stop-dfs.sh
stop-yarn.sh

2.3安装spark

2.3.1下载spark安装spark

安装位置为/home/kyle/env

2.3.2配置spark环境变量

sudo vim /etc/profile

export SPARK_HOME=/home/kyle/env/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

source /etc/profile

2.3.3 配置spark环境

2.3.3.1查看python位置

python3

import sys
print(sys.path)

结果为/usr/bin/python3.6

2.3.3.2 在spark中配置python3.6环境变量

cd /home/kyle/env/spark/conf
cp spark-env.sh.template spark-env.sh
vim spark-env.sh

export PYSPARK_PYTHON=/usr/bin/python3

2.3.4 运行pyspark

pyspark

2.4 pyspark进行简单数据处理

2.4.1统计行数

sogou = sc.textFile("/home/kyle/job/sogou.txt")
sogou.count()

2.4.2查找有某个单词的行

baidu_lines = sogou.filter(lambda line: "百度" in line)
baidu_lines.first()
baidu_lines.count()

2.5编写spark的python程序

2.5.1 统计关键词的查询次数并进行排序

#!/usr/bin/python3.6
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)

sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: (x[2], 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/t1")

2.5.2统计独立uid数

#!/usr/bin/python3.6

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)

sogou = sc.textFile("/home/kyle/job/sogou.txt")
sogouf = sogou.map(lambda line: line.split("\t"))

#num_uid 独立的用户id数量
num_uid = sogouf.map(lambda fields:fields[1]).distinct().count()
file = open('/home/kyle/job/t2.txt','w')
file.write('num_uid = '+str(num_uid))

2.5.3 根据访问次数对网址进行排序

#!/usr/bin/python3.6

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)

sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: (x[5], 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/t3")

2.5.4 统计每小时的搜索量

#!/usr/bin/python3.6

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)

sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: x[0][:-4]).map(lambda x: (x, 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/t4")

2.5.5 用户查询次数排行榜

#!/usr/bin/python3.6

from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)

sogou = sc.textFile("/home/kyle/job/sogou.txt").map(lambda line: line.split("\t"))
sogou.map(lambda x: (x[1], 1)).reduceByKey(lambda x,y: x+y).map(lambda x: (x[1], x[0])).sortByKey(False).map(lambda x: (x[1], x[0])).saveAsTextFile("/home/kyle/job/timesRank")

2.6通过spark-submit name.py 运行程序

spark-submit t1.py

2.7对输出文件进行处理

输出结果都在home/kyle/job下,其中t1,t3,t5中含有多个文本文件。为了便于分析,只选取关键词查询次数中的前30,即t1中的前30。

cd /home/kyle/job/t1
head -30 part-00000 > ../t1.txt

网址中的前30,t3;用户查询次数的前30,t5;方法同上。而统计每小时的搜索量则是所有数据分布在多个文件夹中。处理方法为:

cd /home/kyle/job/t4
cat part-* > ../t4.txt 

2.8使用excel对统计结果进行分析

3 统计结果

3.1 pyspark

3.1.1 统计数据总条数

sogou = sc.textFile("/home/kyle/job/sogou.txt")
sogou.count()

3.1.2查找有某个单词的行

baidu_lines = sogou.filter(lambda line: "百度" in line)
baidu_lines.first()
baidu_lines.count()

图1中展示了打开pyspark后欢迎界面,查询的数据总条数为5000000条,数据中含有”百度”的数据的总条数为38441条。

图1 pyspark运行结果

所有的python文件放置的位置为/home/kyle/job/py

命名为t1.py, t2.py, t3.py, t4.py, t5.py。具体程序参见2.5或者附件程序。

cd /home/kyle/job/py

3.2.1 统计关键词查询次数并进行排序程序参见2.5.1

spark-submit t1.py

执行过程中会输出查询结果的文件。图2为排名前30的关键词及其搜索次数。图3为其的柱状图表示。从柱状图中可以直观地看出,sogou的搜索关键词排名第一的毫无疑问是另外一个搜索引擎,因为第一名是”百度”,第二名是”baidu”。

图2 t1.py执行结果的前30条数据
图3 关键词查询次数前30

3.2.2 统计独立uid数量程序参见2.5.2

图4为独立用户id数量的结果,数量为1352664,由3.1可以知道查询的总次数的总条数为5000000条,平均每位用户的查询次数为3.696次。

图4 uid的数量

3.2.3 根据访问次数对网址进行排序(前10)程序参见2.5.3或附件

图5为执行结果的前10条数据。图6为访问次数前10的网址及其占比。可以看到与3.2.1中的结果是一致的www.baidu.com的访问次数占据前10的43%。

图5 网址查询次数排名(前10)
图6 搜索次数前十的网址比例

3.2.4 统计每小时的搜索量程序参见2.5.4或附件

图7为每小时的搜索量,可以看到2011年12月31号的数据存在明显异常。


图7 每小时的搜索量

图8为2011年12月30号每小时搜索量的变化图。可以看到搜索量在零点时处于较低的位置,而后一直缓慢下降,至凌晨5点,搜索量开始缓慢上升,7点开始迅速上升;而后从9点到21点一直处于一个较高的位置。

图8 每小时的搜索量变化图

3.2.5 用户查询次数排行榜(前10)程序参见2.5.5或附件

图9为用户查询次数的前10条数据。可以看到查询次数最多的用户这一天的查询次数居然高达11528次。也就是说该用户平均每7.5秒进行一次查询。所以基本可以判断,该用户为爬虫。图10为查询次数前十的用户查询次数占比图。

图9 用户查询次数排行榜(前10)
图10 查询次数前十的用户查询次数分布

4 总结

本次实验,首先部署好spark的实验环境。然后利用pyspark进行了简单的查询操作,比如查询数据的总条数,查询含有某个单词的数据的总条数,打印第一条等。之后在编写python独立程序,统计了搜索关键词的查询次数并进行了排序,统计了独立的用户数量,根据网站访问次数进行排序,统计了每小时的搜索量,对每个用户的搜索次数进行了统计并排序。最后对这些数据进行了分析。得出了以下结论:(1)使用sogou的用户中有很多人会直接搜索百度;(2)独立uid的数量为1352664,数据的总条数为5000000条,平均每位用户每天的查询次数为3.696次。(3)每小时的搜索量体现的数据为白天搜索量大,凌晨搜索量小。(4)基本可以判断,搜索量排名第一的用户为爬虫,因为其平均每7.5秒便进行一次搜索。(5)31号的每小时的搜索量非常不正常,如图7所示,所以没有纳入每小时搜索量的统计。

你可能感兴趣的:(spark数据分析(sogou500w数据集))