欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    《Spark大数据技术与应用案例教程》教案第20课分析社交网站的用户影响力.docx

    • 资源ID:1242642       资源大小:95.48KB        全文页数:12页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《Spark大数据技术与应用案例教程》教案第20课分析社交网站的用户影响力.docx

    课题分析社交网站的用户影响力课时2课时(90min)教学目标知识技能目标:(1)掌握读取数据创建图的方法(2)掌握使用GraphFramc类的属性和图的叫操作方法处理图的方法(3)掌握图的常用算法素质目标:(1)运用图算法处理日常生活中的数据关联性问题。(2)加强自身观察能力,发掘事物之间的关联性。教学重难点教学重点:图的创建、图的数据操作、图的常用算法教学难点:使用图的常用算法解决实际问题教学方法案例分析法、问答法、讨论法、讲授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软件,完成课前任务请大家回顾上一节课所学知识,并了解GraPhFrameS中图的创建方法、操作方法和常用算法。【学生】完成课前任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入【教师】提出以下问题:你知道在GraphFrames中创建图的方法吗?【学生】思考、举手回答传授新知【教师】通过学生的回答引入新知,介绍图的创建、图的数据操作、图的常用算法等知识一、图的创建【教师】介绍GraphFrames中图的创建方法GraphFrame是GraphFrames中的核心相象,用于表示和操作图数据。从逻辑上看,GraphFrame由顶点DataFrame和边DataFrame组成顶点DataFrame必须包含名为id的列,用于存储唯一的顶点IDe边DataFrame必须包含名为src和dst的列,分别用于存储边的源顶点ID和目标顶点IDe在GraphFrames中,创建图的方法有三种:第一种是根据顶点DataFrame和边DataFrame创建图;第二种是根据RDD创建图;第三种是读取文件中的数据创建图。1.根据顶点DataFrame和边DataFramc创建图在GraphFrames中,可以使用GraPhFrame()方法根据顶点DalaFrame和边DalaFrame创建图,该方法的基本格式如下。GraphFrame(v,e)其中,参数V表示保存顶点信息的DataFrame;参数e表示保存边信息的DataFramee【教师】通过例子,帮肋学生掌握根据顶点DataFrame和边DataFrame创建图的方法【例6-1根据顶点DataFrame和边DataFrame创建图。使用GraPhFrame()方法以城市作为顶点,距离作为边创建图,图的顶点信息和边信息如图6-5所示。hadoopbogon$pyspark»>fromgraphframesimportGraphFrarnc建顶点DataFrame,包含顶点的标识符(id)和城市(city)»>vertices=spark.createDataFrame("A","NewYork"),("B","London"),(',C",',Tokyo"),id'"city0)舱J建边DataFrame,包含边的源顶点(Src)、目标顶点(dst)和距离(distance)»>edges=spark.createDataFrame("A","B",55),("B","C",6500),(''C",',A",8000),I,'src'"dst","distance")#根据顶点和边的DataFrame创建图»>graph=GraphFrame(vertices,edges)#显示图的顶点信息»>graph.vertices.show()#显示图的边信息+srcdstdistance)ABl55001BCl6500ClAl8000十÷>» graph. edges. show()»>graph.edges.show()»>graph.vertices.show()+IidIcity+IANewYorkBLondon)ICTokyoI+图的顶点信息和边信息图6-52.根据RDD创建图在GraphFrames中,如果斓存储在RDD中,我们首先需要将RDD转换为DataFrame,然后使用GraPhFrameo方法创建图。【教师】通过例子,帮助学生掌握根据RDD创建图的方法【例6-2根据RDD创建图,输出图的顶点信息和边信息,如图6-6所示。|hadoopbogon-$pyspark»>fromgraphframesimportGraphFrame制建RDD,包含(顶点ID,属性沅组»>rdd=spark.sparkContext.parallelize(l,'A'),(2,'B').(3,rC)# 将RDD转换为DataFrame»>vertices_df=rdd.toDF(,id,"attribute")跄J建RDD,包含(源顶点ID.目标顶点ID,边属性)元组»>edges_rdd=spark.sparkContexl.parallelize(1,2,edge).(2,3.,edge2,)# 将RDD转换为DataFrame»>edges-df=edges_rdd.toDF("src","dst","relationship")# 使用GraPhFrame()方法创建图»> graph.vertces.show()»> graph.edges.show()»> graph, vertices, show() +I idattribute) +I1|AlI2BlI3Cl»>graph=GraPhFrame(VertiCeS_df,edges_df)»>graph.edges,show()+Isrcdstrelationship(+I12edgel|23edge2|.图6-6图的顶点信息和边信息3.读取文件中的数据创建图在GraPhFmmeS中,如果数据存储在文件中(如CSV、ParqUel等文件),我们需要先使用SPark读取文件中的数据创建DataFrame,然后使用GraPhFrameo方法创建图。【教师】通过例子,帮助学生掌握通过读取文件中的数据创建图的方法【例6-3读取文件中的数据创建图。新建7usrIOCalsparkmycodegraph”目录,并在该目录下新建两个文本文件。“user.txt”文件用于保存用户信息数据,包含用户ID、姓名和职业3个字段,如图6-7所示。“relationship.txt”文件用于保存用户之间的关系数据,包含两个用户ID和用户之间的关系,如图6-8所示。打开(0)区usertxt保存三X打开9)Iarelati""保存(三)三IXuserlJohnstudentuser2Janepostdocuser3Davidprofessoruserluser2collaboratoruser3user2leaderuser3userladvisor图&7用户信息数据图6-8用户之间的关系数据读取文件中的数据创建DataFrame然后使用GraPhFrameO方法创建图输出图的顶点信息和边信息,如图6-9所示。hadoopbogon$pyspark»>fromgraphframesimportGraphFrame# 读取user.txt文件中的数据创建RDD»>vertices_rdd=spark.sparkContext.textFile("file:/usr/local/spaik/mycode/graph/user.txt").map(lambdaline:line.split("")# 将RDD转换为顶点DataFrame»>vertices_df=spark.createDataFrame(vertices_rdd,"id",',name","profession")# 读取relaiionship.txt文件中的数据创建RDD»>dges_rdd=spark.sparkContext.textFile("file:/usr/local/spark/mycode/graph/relationship.txt").ma(lambdaline:line.split("")# 将RDD转换为边DataFrame»>edges_df=spark.createDataFrame(edges-rdd,"src","dst","relationship")愉建图»>graph=GraPhFrame(VertiCeS_df,edges_df)»>graph.vertices.show()»>graph.edges.show()>>> graph.vertices.show()id I ameprofession)Iuserl John student) Iuser2 Janej postdoc Iuser31Davidj professor»> graph. edges. show()I src dstrelationship!Iuserl user3 I user3+user21 collaborator!user2Ileader)userlIadvisor+图69图的顶点信息和边信息二、图的数据操作【教师】介绍GraPhFrameS中图的数据操作创建图之后,可以对图中的数据进行操作,帮助用户从图中提取有用信息。在GraphFrames中,GraphFrame类包含vertices、edges、triplets、inDegrees、OutDegrees和degrees等属性。这些属性的详细说明如表6-1所示。表6-1GraphFrame类的属性属性说明vertices通过VertiCeS属性,用户可以访问和操作图中的顶点集合edges通过edges属性,用户可以访问和操作图中的边集合triplets通过triplets属性,用户可以访问和操作图中的三元组集合。其中,三元组由起始顶点src、边edge和目标顶点dst组成inDegrees通过inDegrees属性,用户可以进行入度分析和筛选操作OutDegrees通过OUtDegreeS属性,用户可以进行出度分析和筛选操作degrees通过degrees属性,用户可以进行度分析和筛选操作(详见教材)表6-2常用的数据操作方法方法DataFrameGraphFramefilter(condition)使用给定条件筛选DataFrame中的数据根据指定的筛选条件对顶点或边进行筛选filterVertices()filterEdges()杳询符合条件的顶点或边OrderBy(*cols,ascending)按照指定列对数据进行排序按照指定列对顶点或边进行排序groupBy(*cols)按照指定列对DataFrame进行分组按照指定列对顶点或边进行分组withColumn(colName,col)添加新的列或修改现有的列用于映射图的顶点或边,即向顶点或边中添加新的列或修改顶点或边中现有的列WithCOlUmnRenamed(existing,new)修改DataFrame中的列名修改顶点或边中的列名select(*cols)查询指定字段的数据信息查询顶点或边中指定字段的数据信息selectExpr(*expr)在DataFrame上执行复杂的表达式和聚合操作在顶点或边上执行复杂的表达式和聚合操作union(other)合并两个DataFrame合并两个图的顶点或边join(other,on,how)使用给定的连接表达式与另一个DaIaFrame进行连接使用给定的连接表达式连接两个图的顶点或边【教师】通过例子,帮助学生掌握GraPhFrameS中图的数据操作【例6-4查询顶点和边的信息。对例6-3创建的图graph执行数据操作,首先使用vertices属性,查询顶点信息、顶点个数和职业为student的顶点信息;然后使用edges属性,/询边信息;最后使用triplets属性,查询三元组信息。数据操作的代码和输出结果如图6-10所示。>>>IgraPh.vertices.ShoW()1查询图的顶点信息+IidInameprofession)userlJohnstudentIuser2JanepostdocIuser3Davidprofessor)»>IgraPh.vertices,count()0查询顶点个数>»graph.vertices.filter(graph.vertices.profession="student").show()+Iidnameprofession)I查询职业属性为Student的顶点信息IuserlJohstudent.»>graph.edges,show()查询图的边信息Isrcdstrelationship)Iuserluser2collaborator!Iuser3Iuser2IeaderjIuser3userladvisor查询图的三元组信息»>IgraPh.triplets.ShoW(trunCatC=FalSe)IIsrcIedgeIdstIuserl,John,studentuserl,user2,collaboratoruser2,Jane,Iuser3,David,professor)user3,user2,leaderuser2,Jane,Iuser3,David,professoruser3,userl,advisor(userllJohn,+postdoc)IpostdocIstudent(图6-10查询图的各项信息【例6-5查询每个顶点的出度值、入度值和度数值。对例6-3创建的图graph执行数据操作,分别使用OUtDegrees、indegrees和degrees属性,直询每个顶点的出度值、入度值和度数值。数据操作的代码和输出结果如图6-11所示。»>graph.outDegrees.show()>>>graph.inDegrees.show()>>>graph.degrees.show()IidIdegreeIuserlI2user32user22每个顶点的度数值IidIoutDegree+÷IuserlI1Iuser32IidIinDegreeI+÷Iuserl11Iuser2121+每个顶点的入度值每个顶点的出度值【高手点拨】入度值表示以当前顶点为起始点的边的数量;出度值表示以当前顶点为目标顶点的边的数量;度数值为入度值和出度值的和。【例6-6计算每个分组内顶点的数量。对例6-3创建的图graph执行数据操作使用groupBy()方法按照profession列对顶点进彳亍分组,并计算每介分组内顶点的数量。数据操作的代码和输出结果如图6-12所示。»>graph.vertices.groupBy("profession").count().show().-÷Iprofession)countI-.IprofessorIlstudent)1IpostdocI1+图6/2每个分组内顶点的数量【例6-7提取子图。对例6-3创建的图graph执行数据操作分别使用filterVerticesO方法和filter()方法提取姓名为John的顶点。数据操作的代码和输出结果如图6-13所示。>>>graph.filterVertices("name='"hn,l,).vertices,show()+-+Iidnameprofession!方法一:助蚁顿政0方法IuserlIJohn student|方法二:filter。方法>>>lfilter_vertices_df=qraph.vertices,filter("name='John'”»>GraphFrame(filter_vertices_df,graph.edges).vertices.show()idInameIprofession)IuserlIJohnstudent图6-13提取子图【小提示】使用GraphFrames的提供的方法如FilterVertiCeS()执行数据操作后,返回一个新的图。使用DataFrame提供的方法执行数据操作后,返回一个新的DataFramez需要使用GraPhFrame()方法重新创建图才能得到图数据。【例6-8映射顶点。对例6-3创建的图graph执行数据操作,使用WithCOlUmn()方法将name列的数据均转换为大写并将新的列名设置为new-property数据操作的代码和输出结果如图6-14所示。>»frompyspark.sql.functionsimportcol,upper»»»transformed.vertices.df三graph.vertices.withColumn("new.property",UPPer(Col("name").show()+.-+IidInameprofession)new.property+-+-+IuserlJohnstudent)JOHNIuser21JanejpostdocjJANEIuser31DavidIprofessor)DAVID图6-14映射顶点【例6-9顶点连接。对例63创建的图graph执行数据操作,使用join()方法根据共同的列id将两个图的顶点进行连接。数据操作的代码和输出结果如图6-15所示。»>second.vertices,data=("userl",1),(',user2,1,2),.»>second_vertices_df=spark.createDataFrame(second,vertices_data,"id","label")»>graph.vertices.join(second_vertices_df,"id").show()+-+Iidameprofessionlabel+-+IuserlIJohnstudent|1|Iuser2Janepostdoc|2|图6-15顶点连接【教师】提出任务请使用Uniono方法实现例6-9的顶点连接功能。【学生】按照要求进行操作三、图的常用算法【教师】介绍GraPhFrameS中图的常用算法GraphFrames提供了一些高级的图算法和图处理工具,使用户能够在分布式环境中进行图分析。图的常用算法包括PageRankxLabelPropagation和ShortestPaihs等。1.PageRank算法PageRank算法又称网页排名算法,该算法的核心思想是通过分析网页之间的链接关系,为每个网页分配一个权重值,表示其在整个网络中的重要性.PageRank算法主要基于两个重要的假设。数量假设:如果一个网页被越多的网页链接到,那么该网页越重要。质量假设:质量高的网页会通过链接向其他网页传递更大的权重。PageRank算法的应用范围从最初的网页排名问题延伸到更广泛的图计算领域,该算法可以帮助我们发现重要顶点、了解顶点之间的关系、预测网络演化趋势等。PageRank算法的基本格式如下。pageRank(resetProbability,source!D,maxller,tol)其中,参数的含义如下。(1)resetProbability(可选):表示重置到随机顶点的概率,默认值为0.15.(2)SourceID(可选):表示个性化PageRank的源顶点。如果不指定该参数,则默认选择图中的一个顶点作为起始点.(3)maxher(可选):表示算法执行的最大迭代次数。如果设置了IoI参数,则不能设置该参数。(4)(可选):表示迭代收敛误差容差,默认值为0.01。如果设置了maxlter参数,则不能设置该参数。PageRank算法的返回值是一个GraphFrame,其中顶点DataFrame中新增的pagerank列存储每个顶点对应的PageRank值;边DataFrame中新增的weight列存储边的权重。【教师】通过例子,帮助学生掌握PageRank算法的应用【例6-10评估每个顶点的重要性。创建图,并使用PageRank算法计算每个顶点的PageRank值,输出结果如图6-16所示。根据结果可以看出,顶点ID为C的PageRank值最大,即该顶点在图中最重要。hadoop(3)bogon$pyspark»>fromgraphframesimportGraphFrame舱0建顶点DataFrame»>nodes=spark.createDataFrame("A","userl'),("B","user2"),("C","user3"),("D","user4"),"id","name")舱0建边DataFrame»>edges=spark.createDataFrame("A","B"),("B",'C,),("C","An),("D","C"),"src",'dst,)舱)建图»>graph=GraphFrame(nodes,edges)#计算PageRank值»>pagerank=graph.ageRank(resetProbability=0.15,maxler=l)#显示每个顶点的PageRank值»>pagerank.vertices.show()»>pagerank,vertices,show().IidInameIpagerank+IBuser21.1834337192862303Duser410.150000000000000051Cuser31.4507619050829101Auserl1.2158043756308592图6-16每个顶点的PageRank值2 .LabelPropagation算法UbelPr。Pagation算法又称标签传播算法,是一种处理图数据的半监督学习方法。该算法通过在相邻顶点之间传播标签,推断图中顶点的标签,以便将同一社区内的顶点赋予相同的标签。LabelPropagation算法基于一个假设,即在图结构中相邻的顶点更有可能具有相似的特征和属性。1.abelPropagation算法的基本格式如下。labelPropagation(maxIter).(详见教材)【教师】通过例子,帮助学生掌握LabelPropagation算法的应用【例6-11分析用户所属的社区。创建图,并使用LabelPropagation算法分析用户所属的社区,输出结果如图6-17所示。根据结果可以看出,顶点ID为C、A的用户属于同一社区。hadoopbogon-$pyspark»>fromgraphframesimportGraphFrame# 创建顶点DataFrame»>vertices=spark.createDataFrame("A'"Alice"),("B","Bob"),("C","Charlie").(,'D,"David"),("ELEsiher"),(,'F","Fanny"),"id","name")将创建边DataFrame»>edges=SPark.CreaieDaiaFrame”("Ao,"B"),("B",',C,),("C","A"),("D'"E'),("E","D'r),("Eh,"Fm),("F","Er')h,src,',dst,J)#创建图»>graph=GraphFrame(vertices,edges)# 分析用户所属的社区»>result=graph.labelPropagation(maxIter=20)# 显示用户所属的社区»>result.show()»>result,show()+IidInameIlabel+IFFanny171798691840EEsther369367187456BBob420906795008DDavid171798691840CCharlie420906795008IAAlice420906795008+图6-17不同用户所属的社区3 .ShortestPaths算法ShortestPalhS算法又称最短路径算法,它用于寻找两个顶点之间的最短路径,即在连接两个顶点的所有路径中,找到边数最少或权重最小的路径。ShortestPaths算法的基本格式如下。ShortestPaths(Iandmarks)其中,参数IandmarkS表示一个或多个目标顶点的集合。ShortestPaths算法的返回值是一个DataFrame,其中新增的distances列用于存储图中所有顶点到指定目标顶点的最短路径长度。【教师】通过例子,帮助学生掌握ShOrteStPathS算法的应用【例6-12计算图中所有顶点到指定目标顶点的最短路径长度。创建图,并使用ShortestPaths算法计算所有顶点到目标顶点E的最短路径长度,输出结果如图6-18所示。hadoop(3>bogon$pyspark»>fromgraphframesimportGraphFrame# 创建顶点DataFrame»>vertices=spark.createDataFrame("A","Alice"),("B","Bob"),("C","Charlie"),("D","David"),("E'"Evew),("F',"Frank")1."id","name,J)# 0建边DataFrame»>edges=spark.createDataFrame("Ah,"B",2),("A","C",4),("B",'C",1),("B,',D",5),("C","D",8),("D",',Eh,3),(''E',F,6),("F,'C'7)."src,',dst","weigh,')#创建图»>graph=GraphFrame(vertices,edges)# 计算所有顶点到目标顶点E的最短路径长度»>result=graph.shortestPaths(landmarks="E")# 显示所有顶点到目标顶点E的最短路径长度»>result.show(truncate=False)+lidInameIdistancesl+IFIFrank-E->3IIEIEveKE->IIBIBobHE->2IIDIDavidHE->1IICICharlieIK->2IIAIAliceHE->3I+-+图6-18所有顶点到目标顶点E的最短路径长度【学生】聆听、思考、理解、记录课堂实践【教师】介绍“配置分析社交网站的用户影响力”的大概,安排学生扫描微课二维码观看视频“分析社交网站的用户影响力”(详见教材),并要求学生进行相应操作统计社交网站中最具影响力的用户时,首先需要创建图;然后获取每位用户的影响力得分和粉丝数;接着对该得分进行排序;最后获取排名第一的用户即为最具影响力用户。现有社交网站用户关系数据文件7usrIoCalsparkmycodegraphgraph-data.txt",该文件记录了某个时间节点下的用户关系。该文件中的每条数据包含两个用户名和用户编号,且第二个用户是第一个用户的粉丝,如图6-19所示。打开9)区graph-data.txtusrocalsparfcmycode/graph保存(三)三×(User47,8656651),(User83,15647839)-(User47,86566510)f(User42,197134784)(User89,74286565),(User49,19315174)(Userl6,22679419),(User69,45705189)(User37,1455957),(User64,247424)(User31,63644892)r(Userl,1234655)(Userl,12304655),(User50,17613979)(USer37,1455957。),(Userll.14269220)图6-19社交网站用户关系数据文件中的内容(部分)打开PyCharm,新建"graph"目录,在该目录下新建"SocialNetworkpy”文件,然后在该文件中编写应用程序,统计出最具影响力的用户及该用户的粉丝数。实现步骤如下。步骤1创建SpaikSession对象。步骤2A使用textFile()方法读取社交网站用户关系数据创建RDD(即data_rdd)。步骤3A将daia.rdd转换为DaiaFrame(即data_df)首先使用map()方法去除字符串两端的空白字符、括号字符,并分割数据;然后使用toDF()方法将分割好的数据转换为DataFrame,并指定列名为"src-usemame","src_id","dst-username","dst-id")(详见教材)【参考代码】frompyspark.sqlimportSparkSessionfromgraphframesimportGraphFramefrompyspark.sql.functionsimportdesc,litJ建SparkSession对象spark=SparkSession.builder.appName("SocialNetwork").get!Create()# 读取用户关系数据创建RDDdata-file="file:/usr/local/spark/mycode/graph/graph-<lata.txt"data_rdd=spark.sparkContext.textFile(data-file)# 将RDD转换为DataFramedata_df=data_rdd.map(lambdaline:line.strip().replaCe(O.replace。)","").split(",").toDF("src_username","src_id","dst_username","dst_id")哈J建顶点DaiaFrameVertiCeS=data_df.seleclEXPreSrJidasid","src_usemameasusemame").union(data_df.selectExpr("dsi_idasid"."dst_usemameasusername,).distinct()怆J建边DaiaFrameedges=data_df.selectExpr("src_idassrc","dst_idasdst").withColumn("relationshipM,lit("follow")跄J建图graph=GraphFrame(vertices,edges)# 显示图中的顶点信息graph.vertices.show()# 显示图中的边信息graph.edges.show()# 计算每位用户的影响力得分pagerank-df=graph.pageRank(resetProbability=0.15,maxlter=l)娥计国姗户的粉丝数userdata=graph.inDegrees.withColumnRenamed("inDegree","followerscount")# 1里接USeJdata和pagerank-dfuser_data=user_data.join(pagerank_df.vertices,on="id")# 显示每位用户的相关信息USejdata.show。# 获取最具影响力的用户most_influential_user=user_data.orderBy(desc("pagerank").first()# 输出最具影响力用户的用户名和粉丝数print("MostInfluentialUser:",most_influential_user"username")print("FollowersCount:",most_inttuential_user"fbllovers_count")【运行结果】在PyCharm中运行代码,控制台输出图的顶点信息、图的边信息、每位用户的相关信息,以及最具影响力用户的用户名和粉丝数,如图6-20所示。IIdlusernaaelI29758446User68I638271921User2I172318ser21lI165474111User6lI1426922IUserlllI121152USer34II15919138US75I1176O242User86I18396795IUser24I247416851USr87lI15913lUserMlI154344321User9I1649781ISrl3lI2397258User25l245487159U

    注意事项

    本文(《Spark大数据技术与应用案例教程》教案第20课分析社交网站的用户影响力.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开