《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操作,得到每个键对应的平均值,输出结果如图2-33所示。hadoopbogon$pyspark醐谶!蒯RDD»>rdd=sc.parallelize("key1",1),("key1,2),("key2'3),(,key2",4),("key2",5)# 初始值为一个元组,第一个元素为该键的总和,第二个元素为该键的数量»>CreateCombiner=lambdax:(x,1)# 对于每个新的值,将其累加到总和中,并增加键的数量»>mergeValue=lambdaacc,x:(acc0+x,acc1+1)蛤并两个键的结果»>mergeCombiners=lambdaacc1,acc2:(acc10+acc20.acc11+acc21)# 计算每个键的平均数»>aVgByKey=bineByKey(createCombiner,mergeValue,mergeCombiners).mapValues(lambdax:x01xl)# 输出结果»>print(avgByKey.collect()»>print(avgByKey.collect()(,key,1.5),('key2',4.0)图2-33输出每个键对应的平均值首先,取出RDD中的首个元素("key1",1),键"keyl"首次出现,此时会调用CreateCombiner函数,将"keyl”对应的值(即1)转换成形式为(值,数量)的元组(1).然后,取出RDD中的第二个元素(“key】”,2),键"keyl"第二次出现,此时会调用mergeValue函数,将2加到(Il)的第一个元素中(即值的部分),并将数量加1,得到(3.2).与“keyl"进行同样的操作,"key2''得到(12,3).接着,调用mergeCombiners函数将不同分区的统计结果进行合并,得到(键,(累加值,计数值)的结果,P(keyl,(3,2)ffl(key2,(12,3).最后,执行mapValues操作求出每个键对应的值的平均值。【学生】聆听、思考、理解、记录课程实践【教师】介绍“计算学生的平均成绩”的大概流程,安排学生扫描微课二维码观看视频”计算学生的平均成绩”(详见教材),并要求学生进行相应操作打开PyCharm,在"rdd"目录下新建"average.py"文件,然后在该文件中编写应用程序,输出学号、姓名、考试成绩、操行成绩和平均成绩。实现步骤如下。步骤IA配置Spark应用程序并创建SparkContext对象。步骤2A获取考试成绩RDD(exam_scores_rdd)0步骤3A创建考试成绩键值对RDD(exam_scores_pairRdd)。步骤4A创建学生信息键值对RDD(name,pairRdd)。步骤5参照步骤2,对操行成绩进行同样的处理,获取操行成绩RDD(conduct_scores_rdd).步骤6A创建操行成绩键值对RDD(conduct-SCoreS-pairRdd)步骤7A获取合并后的成绩键值对RDD(merged_scores_pairRDD).步骤8A定义COmbineByKCy(臊作所需的三个函数CrealeCombiner、mergeValuemergeCombiners,用于计算每位学生的考试成绩和操行成绩的和。(详见教材)【学生】自行扫码观看配套微课,按照要求迸行操作,如遇问题可询问老师【教师】巡堂辅导,及时解决学生遇到的问题课堂小结【教师】简要总结本节课的要点键值对RDD的创建键值对RDD的转换操作【学生】总结回顾知识点作业布置【教师】布置课后作业(1)完成项目二项目实训中与本课相关的习题;(2)根据课堂所学知识,课后自己上机练习"计算学生的平均成绩"的操作.【学生】完成课后任务教学反思