《Spark大数据技术与应用案例教程》教案第9课查看商品信息.docx
课题查看商品信息课时2课时(90min)教学目标知识技能目标:(1)掌握DataFrame的创建方法(2)掌握DataFrame的数据获取操作素质目标:培养举一反三的能力,学会融会贯通教学重难点教学重点:DataFrame的创建,DataFrame的数据获取操作教学难点:读取数据并创建DataFrame,获取DataFramc的数据教学方法案例分析法、问答法、讨论法、i井授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软件,完成课前任务请大家了解DataFrame的相关知识.【学生】完成课前任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入【教师】提出以下问题:什么是DataFrame?DataFrame与RDD有何区别?【学生】思考、举手回答传授新知【教师】通过学生的回答引入新知一、DataFramc的创建【教师】介绍DataFrame的概念,以及DataFrame与RDD的区别DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表。DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每列都带有名称和数据类型。DataFrame与RDD的区别如图3-10所示。如果把数据存放到RDD中,则每个元素都是一个对象(如Person对象),但是对的内部结构对于RDD而言是未知的。如果把雌存放到DataFrame中,则每个元素都被封装为RoW类型,SParkSQL知道对象的内部结构信息,即列数、每列的名称和数据类型。StringIntDoubleStringIntDoubleStringIntDoubleNameAgeHeightStringIntDoubleStringIntDoubleStringIntDoubleRDDIPersonlDataFrame图3-10DataFrame与RDD的区别DataFrame支持从数据文件、外部数据库、Spark计算过程中生成的RDD.Hive表等不同的数据源中读取数据并创建DataFramee【教师】介绍DataFrame的创建方法1 .通过数据文件创建DataFrameSparkSession是SparkSQL提供的一个处理结构化数据的编程接口,它支持从不同的数据源中读取数据并创建DaIaFrame,还支持执行不同的SQL置旬和DataFrame操作等.在开发独立应用程序时,通过SparkSession.builder可以创建一个SparkSession对象,并配置Spark应用程序的相关属性,参考示例如下。frompysparkimportSparkContext5SparkConffrompyspark.sqlimportSparkSessionspark=SparkSession.buiIder.appName("MyApp,').getOrCreate()builder是SparkSession的一个构造器,其常用方法及说明如表3-1所示。表3-1builder的常用方法及说明方法说明appName(name)为应用程序设置一个名称,该名称将在SparkWebUI中显示。参数name为应用程序的名称master(master)设置Spark连接的主节点URL,如“local”表示本地运行、“spaik:/master:7077,表示在Spark独立集群上运行。参数master为Spark主节点的URLconfig(key,value,conD设置一个配置选项,使用该方法设置的选项会自动传到SparkConf和SparkSession的配置中。参数key(可选)为配置属性的键名;参数value(可选)为配置属性的值;参数conf(可选)为SparkConf的实例enableHiveSupport()启用Hive支持,包括连接到持久的Hive元存储,支持HiveSerDes和Hive用户定义函数getOrCreate()获取一个现有的SparkSession,如果不存在,则会基于此构建器中设置的选项创建一个新的SparkSession通过数据文件创建DataFrame时,使用SparkSession对象的read属性获取SparkSQL中的外部数据源访问对象DataFrameReader后,可以直接使用DataFrameReader对象的text()Njson()sCSVO或parquet()方法读取不同文件中的数据创建DataFrame;也可以使用DataFrameReader对象的format。方法指定输入数据源的格式,接着使用该对象的load()方法读取数据源中的数据创建DataFramee参考示例如下。#1卖取文本文件中的数据创建DataFramespark.read.text("people.txt")spark.read.formai("text").load("people.txt")卖取JSON文件中的健创建DataFrame#方法一#方法二spark.read.json("people.json")#方法一spark.read.fonat("json").load("people.json")#读取CSV文件中的数据创建DataFrame#方法二spark.read.csv("people.csv")#方法一spark.read.format("csv").load("people.csv")僦取Parquet文件中的数据创建DataFrame#方法二SPark.read.parquei("people.parqueT')spark.read.fbat("parquet").load("people.parquet")#方法一#方法二【高手点拨】SparkSQL的默认数据格式是Parquet.Parquet文件由多个行组(rowgroup)组成,每个行组包含多个列块(columnchunk),每个列块都独立地进行压缩和编码,以提供更好的读写性能.ParqUet文件用于高效地存储和处理大规模投艇.【教师】通过例子,帮助学生掌握通过数据文件创建DataFrame的方法【例3-1,7usr/local/spark/mycode/output.jsonM文件的内容如图3-11所示。读取该文件中的数据创建DataFrame(即df),然后使用ShoWo方法显示df中的数据,如图3-12所示.hadoopbogon$pyspark#读取数据创建DataFrame»>df=spark.read.json("fileusrlocalsparkmycodeoutput.json,')#显示DataFrame中的数据»>df.show()I打开一阿方梵黑I保存月×<"name'77"AXice'r,"age":25"name":"Bob","age":3)"name":"Charlie","age":35图3-11M/usr/local/spark/mycode/output.jsonM文件的内容»>df.show()+IageIname+I25AliceI30BobI351Charliel图3-12显示df中的数据【小提示】启动pyspark交互式执行环境后,pyspark会默认提供一个SparkContext对象(名为SC)和一个SparkSession对象(名为spak),无需手动创建。2 .通过外部数据库创建DataFrame在SparkSQL中,通过外部数据库创建DataFrame时需要通过Java数据库互连(JaVadatabaseconnectivity.JDBC)或开放式库互连(OPendatabaseconnectivity,ODBC)的方式访问数据库。通过外部数据库创建DataFrame的方法是使用SparkSession对象的read属性获取DataFrameReader对象后,可以直接使用DataFrameReader对象的jdbc()方法从外部数据库中读取数据创建DataFrame;也可以先使用DaIaFrameReader对象的fomal()方法指定访问外部数据源的方式,接着使用OPtiOnO方法配置连接外部数据源的选项,最后使用IoadO方法读取数据创建DataFramee参考示例如下。#方法一spark.read.jdbc(url,table,properties)#方法二df=spark.read.format("jdbc").option("driver",',com.mysql.jdbc.Driver").option(',url","jdbc:mysql:/hostname:pori/database").option("dbtable","table_name").option("user",',usemame").option("password","password").load()【教师】通过例子,帮助学生掌握通过外部数据库创建DataFrame的方法【例3-2通过MySQL数据库创建DataFramee创建数据库spark;然后在该数据库中创建一个student表,表中包含姓名(name),年龄(age)和学院(college)字段;接着在student表中插入两条数据;最后查询student表的所有数据,如图3-13所示。|hadoopbogon-!$mysql-uroot-p跄J建幡库SParkmysql>createdatabasespark;mysql>usespark;怆J建一个student表mysql>createtablestudent(namechar(30),ageint,collegechar(40);#在student表中插入两条mysql>insertintostudentVaIUeS('Alice:20.'艺术学院);mysql>insertintostudentvalues('Bob',I8,'会计学院");楂询student表的所有降mysql>select*fromstudent;mysql>quit;mysql>select*fromstudent;+Inameagecollege+IAliceI20I艺术学院I1 BobI18I会计学院I+2 rowsinset(0.00sec)图3-13student表的数据读取MySQL数据库spark中studeni表的数据创建DaiaFramee首先,使用formal。方法指定访问MySQL嫡库的方式为jdbc.然后,使用多个OPtion()方法配置选项,设置JDBC驱动程序的类名,因为在建立JDBC连接之前需要加载相应的驱动程序;设置MySQL的Url的地址和端口,告诉Spark程序连接的MySQL数据库的名称,以及数据库连接的相关信息;指定读取数据的表名、MySQL数据库的账户名称和密码。最后,使用IOado方法读取数据创建DataFramee创建DataFrame后可以使用ShoWo方法显示DataFrame(BPjdbcDF)的所有数据,如图3-14所示。(hadoop(>bogon-$pyspark»>jdbcDF=spark.read.format("jdbc").option("driver","com.mysql.jdbc.Driver").option("urr"jdbc:mysql:/localhost:3306/spark").option("dbtable","student").option("user","root").option("password","123456").load()»>jdbcDF.show()»>jdbcDF.show()+InameIagecollege+Alice20|艺术学院IIBob18|会计学院I+图3/4显示jdbcDF中的数据3 .通过RDD创建DataFrame通过RDD创建DataFrame的方式有两种。(1利用反射机制推断RDD模式。利用反射机制来推断包含特定类型对象的RDD的模式Schema1(2)使用编程方式定义RDD模式。使用编程接口构造一个Schema,并将其应用在已知的RDD上.现有一个"usrlocalSParkZmyCOde/student.txt"文件,其内容如图3-15所示。下面以该文件数据为基础,使用两个例子详细介绍通过RDD创建DataFrame的方式。打开(0)StudentZ保存=XIIIttualusrocalsparkMikef19Cindy,20Justin,19图3-15M/usr/local/spaik/mycode/student.txtw文件的内容【教师】通过例子,帮助学生掌握通过RDD创建DataFrame的方法【例3-3利用反射机制推断RDD模式。读取"studenttxt”文件中的数据创建RDD,再将RDD转换为DataFrame,并显示其中的数据,实现步骤如下。首先使用IeXtFiIe()方法读取“student.txt"文件中的数据创建RDD;然后使用map。方法将以逗号分隔的字符串转换为列表最后使用map。方法将每个列表转换为TRow对象返回含多个Row对象的RDD(即student)。其中,Rou对象的name和age属性分别对应列表的第1个和第2个元素。使用SparkSession对象的CreaIeDaiaFrameO方法将生成的Row对象转换为DataFrame(即SchemaStudent)CreateDataFrameo方法会使用反射机制读取RDD中的数据,并从中推断出每列的名称和数据类型,然后自动生成一个Schema,生成的Schema用于描述DataFrame中包含的结构信息。【高手点拨】CreateDataFrame(data,schema.SamplingRatio.VerifySChema)方法用于根据给定的和模式创建一个DataFrame0参数data为待转换为DataFrame的数据,可以是RDDx列表或DataFrame;参数schema(可选)为DataFrame的结构信息;参数SampIingRaiio(可选)表示自动推断结构信息时所采用的数据采样比例;VerifySchema(可选)表示是否验证数据和结构信息的对应关系,默认值为True。使用ShOW()方法显示数据,如图3-16所示。hadoop()bogon-$yspark»>frompyspark.sqlimportRow怆J建RDD和字典对象»>student=spark.sparkContext.textFile("file:/usr/local/spark/myco<le/student.txt").map(lambdaline:line.splil(',).map(lambdas:Row(name=s0,age=int(s1)哈J建DalaFrame»>SchemaSiudent=SparkxreaieDaiaFrame(Student)»>schemaStudent.show()>»schemastudent,show()+-+nameIage+-+IMike19|ICindyj20|IJustinj19|+-+图3/6显示学生班【例34】使用编程方式定义RDD模式。DataFramC的结构可以看作是“表头”和"表中数据”的组合。使用这种方式创建DataFrame的步骤可理解为使用编程定义Schema,即制作"表头”;然后读取文件中的数据创建RDD,即制作“表中数据“;接着将“表头”和“表中数据”组合在一起创建DataFrame;最后显示DataFrame的数据。实现步骤如下。创建列名字符串SchemaString,包含name和age将列名字符串schemastring按空格分割成列表,并使用列表推导式创建由StructField对象组成的列表fields,【高手点拨】createDataFrame(data,schema,SampIingRatio,VerifySChema)方法用于根据给定的数据和模式创建一个DataFramee参数data为待转换为DataFrame的数据,可以是RDDn歹IJ表或DataFrame;参数schema(可选)为DataFrame的结构信息;参数SamplingRatio(可选)表示自动推断结构信息时所采用的数据采样比例;VerifySchema(可选)表示是否验证数据和结构信息的对应关系,默认值为True.(详见教材)4.通过Hivc表创建DataFrameSparkSQL可以通过Hive表创建DataFrame,创建方法是在创建Sp*rkSession对象时使用enableHiveSupporl()方法启用HiVe支持,接着使用SqlO方法查询HiVe表中的数据创建DalaFrame.【教师】通过例子,帮肋学生掌握通过Hive表创建DataFrame的方法【例3-5查询Hivc表中的数据创建DataFramee#创建SparkSession对象并启用Hive支持»>spark=SparkSession.builder.appName("HiveDataFrame").config("spark.sql.warehouse.dir",7userhivewarehouse").enableHiveSuppol().getOrCreate()#使用SparkSQL囱旬Hive表中的仓IJ建DataFrame»>df=spark.sql("SELECT*FROMmydaiabase.my_hive_table")»>df.show()【高手点拨】使用SqIo方法查询Hive表中的数据,要在其中引用Hive表名。Hivc表名由数据库名称和表名称组成,可以使用分隔两者。二、DataFrame的数据获取操作【教师】介绍DataFrame的数据获取操作Spark中DaiaFrame类派生于RDD类,因此对DataFrame的操作也分为转换操作和行动操作。同时,DaIaFrame也具有情性操作的特点,即只有执行行动操作时才真正执行计算。RDD常使用take()xcollect()等行动操作获取数据,DataFrame提供了类似的获取数据的方法,如PrinlSChema()、ShOW()、COlIeCt()、head。、first。和lake。等,如表3-2所示。表3-2获取DataFrame数据的常用方法方法说明printSchema()将DataFrame的每个字段名称和对应的数据类型以树状结构的形式打印show(n,truncate)以表格形式显示DataFrame的数据。参数n(可选)表示显示数据的行数,默认显示前20行数据参数truncate(可选/示显示字符串的长度当truncate是bool型时,表示是否截断长度超过20个字符的字符串,默认值为True;当t-uncate是int型时,如果设置为大于I的数字,则将截取原字符串中的前truncate个字符,并将单元格右对齐(详见教材)【教师】通过例子,帮助学生掌握DataFramc的数据获取操作【例3-6】创建DataFrame,然后使用不同的方法获取DataFramc的数据,如图3-17所示。»>df三spark,read,json("flieusrlocal/spark/mycode/output.json")> >>df.printSchema()rootI-age:long(nullable=true)I-name:string(nullable=true)> >>df.show()+IageIname+-+÷I251AliceI301BobII351Charliel+-> >>df.show(2)+-÷+IageIname÷-÷I25AliceI301BobI+onlyshowingtop2rows> »df.show(2,False)+IageIname÷25AliceI30IBobI+onlyshowingtop2rows> »df.collect()Row(age=25.name='Alice'),Row(age=30tname="Bob"),Row(age=35lname='Charlie')»>df.head(2)Row(age三25,name="Alice'),Row(age三30,name='Bob')>»df.first()Row(age=25,name='Alice')»>df.take(2)(Row(age=25,name='Alice'),Row(age=30,name="Bob')图3-17获取DataFrame数据的不同方法学生】聆听、思考、理解、记录课堂实践【教师】介绍“查看商品信息”的大概流程,安排学生扫描微课二维码观看视频“查看商品信息”(详见教材),要求学生进行相应操作某超市的商品信息存放在"usrIoCaIsparkmycode/DataFrame”目录下的"product.csv”文件中,该文件包含商品编号(ID)、商品名称(name)、商品价格(price)、商品库存(stock)和商品类型(type)字段,部分数据如图318所示。打开(0)aID,name,price,stock,typeOOI,苹果,6.37,100,水果002,香蕉,3.2200,水果003,橙子,4.83,150,水果004,菠萝,16.10,50,水果005,芒果,8.06,75,水果006,木瓜,12.79,80,水果007,葡萄,9.66,120,水果008,西瓜,25.68,30,水果009,琳猴桃,6.37,90,水果010,桃子,11.25t100,水果011,可乐,3.50,200,饮品012,雪碧,3.20,150,饮品013,芬达,4.00,100,饮品014,红牛,7.50,50,饮品015,维他柠檬茶,5.80,120,饮品016,冰红茶,3.80,180,饮品017,绿茶,2.50,250,饮品018,MDf.8.00,80,饮品019,奶茶,6.50,120,饮品020,椰汁,9.90,80,饮品021,白色T恤,59.99,70,服饰022,黑色T恤,55.99,55,服饰023,蓝色衬衫,89.99,49,服饰024,灰色卫衣,109.78,79,服饰025,黑色牛仔裤,99.99,88,服饰026,浅蓝色牛仔裤,89.99,91,服饰图3-18wProdUCLcsvw文件的数据(部分)打开PyCharm,新建"dalaFrame"目录,然后在该目录下新建"prodUCLinfo_df.py"文件,最后在该文件中编写应用程序,读取商品信息文件中的数据创建DataFrame,显示商品信息。实现步骤如下。步骤1通过SparkSession.builder创建一个SparkSession对象,并使用appName()方法指定应用程序的名称为ProdUCLinfO_df;使用masier()方法设置运行模式为本地模式local;使用geirCreaIeo方法根据构造器中的设置创建新的SparkSession对象。步骤2A制作"表头".使用SIrUCtTyPeo方法定义一个包含5个字段的名为PrOdUCLSChema的Schema,每个字段都是一个StructField对象,包括字段名称、字段类型和是否允许为空。步骤3A制作"表中数据"。使用IeXlFile()方法读取商品信息文件"producl.csv"中的数据创建RDD(即product.rdd),然后使用map()方法对该RDD的每行数据进行处理,将其转换为一个列表.(详见教材)【学生】自行扫码观看配套微课,按照要求进行操作,如遇问题可询问老师【教师】巡堂辅导,及时解决学生遇到的问题课堂小结【教师】简要总结本节课的要点DataFrame的创建DataFrame的数据获取操作【学生】总结回顾知识点作业布置【教师】布置课后作业(1)完成项目三项目实训中与本课相关的习题;(2)根据课堂知识,课后自己尝试DataFrame的数据获取操作,查看数据信息。【学生】完成课后任务教学反思