今日学习了如何使用Spark中的累加器功能,并按要求完成了广播变量加上累加器的统计单词的小案例

累加器的功能?

在分布式执行的代码中,累加器accumulator可以进行全局累加

 

小案例:在下图文本中实现1.统计特殊符号出现次数2.对单词出现进行统计

 原码:

# coding:utf8

from pyspark import SparkContext, SparkConf
import re

if __name__ == '__main__':
conf = SparkConf().setMaster("local[*]").setAppName("test")
sc = SparkContext(conf=conf)

file_rdd = sc.textFile("../data/accumulator_broadcast_data.txt")

abnormal_char = [",", ".", "!", "#", "$", "%"]

broadcast = sc.broadcast(abnormal_char)

acmlt = sc.accumulator(0)

lines_rdd = file_rdd.filter(lambda line: line.strip())

data_rdd = lines_rdd.map(lambda line: line.strip())

words_rdd = data_rdd.flatMap(lambda line: re.split("\s+",line))

def filter_words(word):
global acmlt
abnormal_chars = broadcast.value
if word in abnormal_chars:
acmlt+=1
return False
else:
return True

normal_words_rdd = words_rdd.filter(filter_words)

words_with_one_rdd = normal_words_rdd.map(lambda x: (x, 1))

result_rdd = words_with_one_rdd.reduceByKey(lambda x,y: x+y)

print(result_rdd.collect())
print("特殊字符数量:",acmlt)


DAG?

DAG:有向无环图,用于表示代码的逻辑执行流程

1个Action会产生1个DAG,如果在代码中有3个Action 就产生3个DAG一个Action产生的一个DAG,会在程序运行中产生一个J0B
所以: 1个ACTION =1个DAG =1个J0B
如果一个代码中,写了3个Action,那么这个代码运行起来产生3个JOB,每个JOB有自己的DAG一个代码运行起来,在Spark中称之为: Application
层级关系:
1个Application中,可以有多个J0B,每一个JOB内含一个DAG,同时每一个JOB都是由一个Action产生的.