打造基于hadoop的网站日志分析系统(5)之spark在日志分析系统里的简单应用

原创
2014/07/10 09:37
阅读数 3.7K

1.下载spark和运行

wget http://apache.fayea.com/apache-mirror/spark/spark-1.0.0/spark-1.0.0-bin-hadoop2.tgz

这里下载的是1.0.0版,由于我们只是测试spark的用法所以不需要配置spark集群,只需把下好的文件解压,进入bin/文件夹。

spark支持scala,java和python。

scala和java输入命令:./spark-shell python 输入命令 ./pyspark 进入控制台,我们以python为例:


很简单无需任何配置,好的开始是成功的一半,我们继续。


2.简单应用

读取文本文件,我们还是以之前的日志文件为例:

>>>file = sc.textFile("/home/hadoop/20130207.txt") 

PS:python是大小写敏感的;路径要给全,否则默认是你运行命令时的那个路径;python2.7.X版本对编码支持一直是个问题,请尽量统一源文件的编码,如"utf-8".

显示总行数:

>>> file.count()

265063

显示第一行内容:

>>>file.first()

得到所有被ie8访问的url的计数

>>>file.filter(lambda line : "MSIE 8.0" in line).count()

98670

Ps: lambda 是匿名函数的写法;filter默认输入的是整行,上述代码的意思遍历每一行并计算出包含“MSIE 8.0”字符串的行数和。


得到拥有最多字段数的那行的字段个数:

>>> file.map(lambda line : len(line.split("|"))).reduce(lambda a,b: a if a>b else b )

Ps:map(lambda line : len(line.split("|")))是把每行分割成集合并返回集合的成员数;

 python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。


统计每个字符串(字段内容出现的次数:

 file.flatMap(lambda line :line.split("|")).map(lambda word:(word,1)).reduceByKey(lambda a,b:a+b).collect()

结果显示的数据太多了,精神崩溃~~,换个方式~

统计每个字符串(字段内容出现的次数,并显示出现最多个10个字符串

 >>>file.flatMap(lambda line :line.split("|")).map(lambda word:(word,1)).reduceByKey(lambda a,b:a+b).map(lambda (k,v):(v,k)).sortByKey().top(10)

sortByKey是根据键值排序,top是提取前X个记录,跟hive中的limit 类似。由于spark中没有sortByValue方法,所以在排序前先把key和value互换。


展开阅读全文
打赏
0
10 收藏
分享
加载中
更多评论
打赏
0 评论
10 收藏
0
分享
返回顶部
顶部