需求:统计一个或者多个文件中单词次数。文本样式如下:
分析:首先将文本数据读入转为为rdd,并通过flatmap进行切分成单词,然后进行map转化成(k,num),再通过reducebykey累加,
def wordCount():
# file = 'file:///Users/wangyun/Documents/BigData/script/data/data.txt'
# sys.argv[1]
rdd = sc.textFile(sys.argv[1])\
.flatMap(lambda line:line.split("\t"))\
.flatMap(lambda line:line.split(' '))\
.map(lambda x:(x,1))\
.reduceByKey(lambda a,b:a+b)
output = rdd.collect()
for (word,count ) in output:
print("%s:%i"%(word,count))
输出结果
需求:统计一个或者多个文件中自媒体名称次数最多的前N个。文本样式如下:
分析:首先将多个文本数据读入转为为rdd,并通过map进行切分成单词,fliter过滤无效空数据,然后进行map转化成获取媒体号关键词,再通过map转化为(k,num),reducebykey将num相邻数据相加,再sortby排序,最后通过take算子取前N个。
def myTpoN():
#filepath = sys.argv[1]
#通过路径读取文件夹下符合格式的数据文本
filepath = '/Users/wangyun/Documents/CodeManager/qcttpyspider/logs/*.txt'
counts = sc.textFile(filepath) \
.map(lambda x: x.split(': '))\
.filter(lambda x:len(x)>1)\
.map(lambda x:x[1])\
.map(lambda x:x.split('-')[1])\
.map(lambda x: x.rstrip())\
.map(lambda x:(x,1))\
.reduceByKey(lambda a,b:a+b)\
.map(lambda x:(x[1],x[0]))\
.sortByKey(False)\
.map(lambda x:(x[1],x[0]))\
.take(10)
for (word, count) in counts:
print("%s:%i" % (word, count))
print(counts)
输出结果为:
[('山车之路', 6), ('汽车客', 6), ('小盒的车', 6), ('阿南说车', 6), ('环球汽车资讯', 6), ('车轮姐', 6), ('闹闹车', 6), ('粤声汽车音响改装', 6), ('骑着单车创未来', 6), ('忠哥说车', 6)]
需求:假设有一组数据为编号,年龄,计算这组数据中的平均年龄。数据样本如下:
需求,首先读取数据,并将编号和年龄进行分割,可以尝试过滤年龄大于100的异常值,这里不做演示。
def myavage():
filepath ='/Users/wangyun/Documents/BigData/App/spark-3.0.0-preview2-bin-hadoop2.7/data/simple_age.txt'
rdd = sc.textFile(filepath)\
.map(lambda x:x.split(' '))\
.filter(lambda x:len(x)>1)\
.map(lambda x:x[1])
#.reduce(lambda a,b:a+b)
rdd2 = rdd.map(lambda age:int(age)).reduce(lambda a,b:a+b)
avage = rdd2/rdd.count()
print(rdd2)
print(avage)
# print(rdd2.collect())
输出结果:
582
41.57142857142857
以上使用了Spark RDD操作,常用算子《二》进行了综合使用。