《Spark大数据技术与应用案例教程》教案第6课计算学生的平均成绩.docx
课题计算学生的平均成绩课时2课时(90min)教学目标知识技能目标:(1)掌握键值对RDD的创建方法(2)掌握键面寸RDD的转换操作素质目标:掌握编程思路,培养逻辑思维能力教学重难点教学重点:键值对RDD的创建,键值对RDD的转换操作教学睚点:键值对RDD的转换操作教学方法案例分析法、问答法、讨论法、i井授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软件,完成课前任务请大家了解利用Spark计算平均成绩的方法。【学生】完成课前任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入(5min)【教师】提出以下问题:你知道哪些计算学生平均成绩的方法?它们的优缺点各是什么?【学生】思考、举用答传授新知【教师】通过学生的回答引入新知,介绍键值对RDD的创建和犍值对RDD的转换操作等内容一、键值对RDD的创建【教师】讲解键值对RDD的创建方法键值对RDD(pairRDD)是指一种特殊类型的RDD,其中每个元素都是f键值对(key.value),由一个键(key)和一个相应的值(value)组成。读取的数据形式不同,创建键值对RDD的方式也不同.(1)直接创建键gRDDe(2)使用map。方法创建键值对RDDe【教师】通过例子,帮助学生掌握键值对RDD的创建方法【例2-13直接创建健值对RDD,输出结果如图2-24所示。(hadoop(3>bogon-$pyspark陶建键面寸RDD»>pair.rdd=sc.parallelize(,keyl",l),(,key2",2),(,key3",3)爆出键值对RDD的元素»>pair-rdd.fbreach(print)»>pairrdd.foreach(print)(,key3,3)(,key2',2)(,key,1)图2-24输出键值对RDD(pair.rdd)的元素【例2-14使用m叩。方法创建键值对RDD,输出结果如图2-25所示。|hadoopbogon-$pyspark取本地文件hello_spark.txt,并创建名为"words"的RDD»>words=sc.textFile("filezusrlocalsparkmycodehello_spark.txt")# 将每行文本按空格拆分为单词,返回一个新的RDD»>pair_rdd=words.flatMap(lambdalineline.splitC,")# 将每个单词映射为(单词,1)键值对,创建T键值对RDD»>pair_rdd_map=pair-rdd.map(lambdaword(word,l)# 输出键值对RDD的元素»>pair_rdd_map.fbreach(print)»>pair_rdd_map.foreach(print)('Hello',1)('Spark',1)(,D(,love,1)('Spark',1)图2-25输出键值对RDD(pair_rdd_map)的元素二、犍值对RDD的转换操作【教师】讲解犍值对RDD的转换操作键值对RDD能够使用RDD基本的转换操作,同时它具有其独有的转换操作,如keys。、values()sgroupByKey().reduceByKey()xjoin。等。常用的键值对RDD转换操作如表2-6所示。表2-6常用的键值对RDD转换操作转换操作说明keys()返回一个由所有键组成的RDDvalues()返回一个由所有值组成的RDDgroupByKey(numPartilions)根据键(key)对RDD中的元素进行分组,并将每个唯T(key)对应的值(value)放入一个迭代器中,返回一个(K,Iterable<V>)类型的数据集reduceByKey(func,numPartitions)在(KN)键值对的RDD上调用时,返回一个(KV)类型的数据集,其中每个键对应的值都使用给定的func函数进行聚合。可以理解为在groupByKey()的基础上,再对相同键的元素进行聚合操作Join(OtherRDD)将两个键值对RDD中键(key)相同的数据的值(value)存放在f湎中,R三回两例假寸RDDtPm三三(key)果CombineByKey(createCombiner.mergeValue,mergeCombiners,numPartitions,partitionFunc)针对键值对RDD进行求和、求平均值、计数等聚合操作,返回一个新的键值对RDD,其中每个键关联一ZMl合结果。CreateCombiner代表一个函数,用于将每个键的第一个值转换为累加器的初始值;mergeValue代表一个函数,用于将当前键的值合并到相应的累加器中;mergeCombiners代表一个函数,用于合并两个累加器;numPartitions(可选)代表分区数;partitionFunc(可选)代表一个函数,用于自定义轴分区方式sortByKey(ascending)按照键(key)对RDD中的元素进行排序。参数ascending的默认值为True,即升序排列mapValues(func)对RDD中的每个值应用指定的函数func,并保持键不变【高手点拨】gr。UPByKey(燥作返回的是一由键(key)和与之关联的值列表(Iterable<V>)组成的键值对数据集。也就是说gr。UPByKey()会为每个key生成一个值列表,每个值列表被保存为一个可迭代对象。可以使用迭代器(iterator)遍历值列表中的元素,访问RDD分组操作的结果。【教师】通过例子,帮助学生掌握键值对RDD的转换操作【例2-15创建一个包含4个握值对的RDD,执行keys。和VmUeS()操作分别查看RDD键值对的键和值,如图2-26和图2-27所示。hadoopbogon$pyspark敬建f键三7寸RDD»>pairs=sc.parallelize(l,"apple"),(2,"orange"),(3,"banana"),(4,"pear")#获取所有key组成的RDD»>keys=pairs.keys()#输出所有key»>print(keys.collect()#获取所有value组成的RDD»>values=pairs.values()#输出所有value»>print(values.collect()>»print(keys.collect()»>Prlnt(ValUeS.collect。)1,2,3,4,apple','orange','banana',pear'图2-26查看RDD的所有键图2-27直看RDD的所有值【例2-16创建一个包含5个键值对的RDD,执行gr。UPByKM)操作按照城市对数据进行分组,输出结果如图2-28所示。执行reduceByKey()操作按照城市对数据进彳论组,并对同一个城市内的人数进行累加,输出结果如图2-29所示。hadoopbogon$pyspark»>rdd=sc.parallelize("北京"张三上海"李四北京二“王五广州“赵六上海二"钱七")# 按照城市对数据进行分组»>grouped_rdd=rdd.groupByKey()# 输出(城市,可迭代对象)»>grouped-rdd.freach(print)# 按照城市对数据进行分组,并对同一个城市内的人数进行累加»>reduced_rdd=rdd.mapValues(lambdax:1).reduceByKey(lambdaa,b:a+b)# 输出(城市,人数)»>reduced_rdd.colleci()>>>grouped.rdd.foreach(print)('上海',<pyspark.resultiterable.ResultIterableobjectat0x7ffb6b7d7640>)('广州',<pyspark.resultiterable.ResultIterableobjectat0x7ffb6b7d7640>)('北京',<pyspark.Tesultiterable.ResultIterableobjectat0x7ffb6b7d7640>)图2-28groupByKey()操作的输出结果»>reducedrdd.collect。('北京',2),('广州',1),('上海',2)图2-29reduceByKey(func)操作的输出结果【例2-17创建两个健值对RDD,执行join。操作合并两个RDD,输出结果如图2-30所示。同样,执行IeftoUterJoin()和rightOutcrJoin()操作合并两个RDD,输出结果如图2-31和图2-32所示。|hadoopbogon-$pyspark怆J建第f键值对RDD»>rddl=sc.parallelize("apple",1),("orange",2),("banana",3),("pear",4)舱犍第二个键值对RDD»>rdd2=sc.parallelize(',apple,',5),("orange",6),("peach".7),("pear",8)# 执行join(操作合并rddl和rdd2»>joined_rdd=rddl.join(rdd2)# 输出合并结果»>joined_rdd.foreach(print)# 执行IefIOUlerJOin()操作合并rddl和rdd2»>joined_rdd=rdd1.leftOuterJoin(rdd2)#输出合并结果»>joined_rdd.foreach(print)科执行rightOulerJoin(臊作合并rddl和rdd2»>joined_rdd=rdd1.rightOuterJoin(rdd2)#输出合并结果»>joined_rdd.foreach(print)>» joined rdd. foreach(print) (,pear', (4, 8) ('orange, (2, 6) apple', (1, 5)('banana'. (3. NOne)»>joinedrdd.foreach(print)(,pear',",8)('apple,(1,5)(,orange,(2,6)2-31图2-30join(操作的输出结果»>joined.rdd.foreach(print)('apple',(1,5)('orange,(2,6)('peach",(None,7)('pear',(4,8)图2-32HghtOuterJoinO操作的输出结果【高手点拨】IeftoUterJoino操作会将左侧RDD中所有的键都保留下来,并将其与右侧RDD中相同键值的数据进行匹配,如果右侧RDD中没有对应的数据,则对应位置的值为None.这样可以保留左侧RDD中的全部信息并补充右侧RDD中的信息erightOUIerJOinO操作与IenOUIerJoino操作类似。【例2-18创建一个犍值对RDD,然后定义三个函数执行CombineByKeyO操作,得到每个键对应的平均值,输出结果如图