《《Spark大数据技术与应用案例教程》教案第9课查看商品信息.docx》由会员分享,可在线阅读,更多相关《《Spark大数据技术与应用案例教程》教案第9课查看商品信息.docx(10页珍藏版)》请在课桌文档上搜索。
1、课题查看商品信息课时2课时(90min)教学目标知识技能目标:(1)掌握DataFrame的创建方法(2)掌握DataFrame的数据获取操作素质目标:培养举一反三的能力,学会融会贯通教学重难点教学重点:DataFrame的创建,DataFrame的数据获取操作教学难点:读取数据并创建DataFrame,获取DataFramc的数据教学方法案例分析法、问答法、讨论法、i井授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软件,完成课前任务请大家了解DataFrame的相关知识.【学生】完成课前
2、任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入【教师】提出以下问题:什么是DataFrame?DataFrame与RDD有何区别?【学生】思考、举手回答传授新知【教师】通过学生的回答引入新知一、DataFramc的创建【教师】介绍DataFrame的概念,以及DataFrame与RDD的区别DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表。DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每列都带有名称和数据类型。DataFrame与RDD的区别如图3-10所示。如果把数据存放到RDD中,则每个元素都是
3、一个对象(如Person对象),但是对的内部结构对于RDD而言是未知的。如果把雌存放到DataFrame中,则每个元素都被封装为RoW类型,SParkSQL知道对象的内部结构信息,即列数、每列的名称和数据类型。StringIntDoubleStringIntDoubleStringIntDoubleNameAgeHeightStringIntDoubleStringIntDoubleStringIntDoubleRDDIPersonlDataFrame图3-10DataFrame与RDD的区别DataFrame支持从数据文件、外部数据库、Spark计算过程中生成的RDD.Hive表等不同的数据
4、源中读取数据并创建DataFramee【教师】介绍DataFrame的创建方法1 .通过数据文件创建DataFrameSparkSession是SparkSQL提供的一个处理结构化数据的编程接口,它支持从不同的数据源中读取数据并创建DaIaFrame,还支持执行不同的SQL置旬和DataFrame操作等.在开发独立应用程序时,通过SparkSession.builder可以创建一个SparkSession对象,并配置Spark应用程序的相关属性,参考示例如下。frompysparkimportSparkContext5SparkConffrompyspark.sqlimportSparkSes
5、sionspark=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,va
6、lue,conD设置一个配置选项,使用该方法设置的选项会自动传到SparkConf和SparkSession的配置中。参数key(可选)为配置属性的键名;参数value(可选)为配置属性的值;参数conf(可选)为SparkConf的实例enableHiveSupport()启用Hive支持,包括连接到持久的Hive元存储,支持HiveSerDes和Hive用户定义函数getOrCreate()获取一个现有的SparkSession,如果不存在,则会基于此构建器中设置的选项创建一个新的SparkSession通过数据文件创建DataFrame时,使用SparkSession对象的read属性获
7、取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文件中的
8、健创建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)#方法
9、一#方法二【高手点拨】SparkSQL的默认数据格式是Parquet.Parquet文件由多个行组(rowgroup)组成,每个行组包含多个列块(columnchunk),每个列块都独立地进行压缩和编码,以提供更好的读写性能.ParqUet文件用于高效地存储和处理大规模投艇.【教师】通过例子,帮助学生掌握通过数据文件创建DataFrame的方法【例3-1,7usr/local/spark/mycode/output.jsonM文件的内容如图3-11所示。读取该文件中的数据创建DataFrame(即df),然后使用ShoWo方法显示df中的数据,如图3-12所示.hadoopbogon$pysp
10、ark#读取数据创建DataFramedf=spark.read.json(fileusrlocalsparkmycodeoutput.json,)#显示DataFrame中的数据df.show()I打开一阿方梵黑I保存月df.show()+IageIname+I25AliceI30BobI351Charliel图3-12显示df中的数据【小提示】启动pyspark交互式执行环境后,pyspark会默认提供一个SparkContext对象(名为SC)和一个SparkSession对象(名为spak),无需手动创建。2 .通过外部数据库创建DataFrame在SparkSQL中,通过外部数据库创
11、建DataFrame时需要通过Java数据库互连(JaVadatabaseconnectivity.JDBC)或开放式库互连(OPendatabaseconnectivity,ODBC)的方式访问数据库。通过外部数据库创建DataFrame的方法是使用SparkSession对象的read属性获取DataFrameReader对象后,可以直接使用DataFrameReader对象的jdbc()方法从外部数据库中读取数据创建DataFrame;也可以先使用DaIaFrameReader对象的fomal()方法指定访问外部数据源的方式,接着使用OPtiOnO方法配置连接外部数据源的选项,最后使用I
12、oadO方法读取数据创建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的
13、方法【例3-2通过MySQL数据库创建DataFramee创建数据库spark;然后在该数据库中创建一个student表,表中包含姓名(name),年龄(age)和学院(college)字段;接着在student表中插入两条数据;最后查询student表的所有数据,如图3-13所示。|hadoopbogon-!$mysql-uroot-p跄J建幡库SParkmysqlcreatedatabasespark;mysqlusespark;怆J建一个student表mysqlcreatetablestudent(namechar(30),ageint,collegechar(40);#在studen
14、t表中插入两条mysqlinsertintostudentVaIUeS(Alice:20.艺术学院);mysqlinsertintostudentvalues(Bob,I8,会计学院);楂询student表的所有降mysqlselect*fromstudent;mysqlquit;mysqlselect*fromstudent;+Inameagecollege+IAliceI20I艺术学院I1 BobI18I会计学院I+2 rowsinset(0.00sec)图3-13student表的数据读取MySQL数据库spark中studeni表的数据创建DaiaFramee首先,使用formal。方
15、法指定访问MySQL嫡库的方式为jdbc.然后,使用多个OPtion()方法配置选项,设置JDBC驱动程序的类名,因为在建立JDBC连接之前需要加载相应的驱动程序;设置MySQL的Url的地址和端口,告诉Spark程序连接的MySQL数据库的名称,以及数据库连接的相关信息;指定读取数据的表名、MySQL数据库的账户名称和密码。最后,使用IOado方法读取数据创建DataFramee创建DataFrame后可以使用ShoWo方法显示DataFrame(BPjdbcDF)的所有数据,如图3-14所示。(hadoop(bogon-$pysparkjdbcDF=spark.read.format(jd
16、bc).option(driver,com.mysql.jdbc.Driver).option(urrjdbc: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模式
17、。利用反射机制来推断包含特定类型对象的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文件的内容【教师】通过例子,帮助学生掌握通过RD
18、D创建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对象转换为DataFram
19、e(即SchemaStudent)CreateDataFrameo方法会使用反射机制读取RDD中的数据,并从中推断出每列的名称和数据类型,然后自动生成一个Schema,生成的Schema用于描述DataFrame中包含的结构信息。【高手点拨】CreateDataFrame(data,schema.SamplingRatio.VerifySChema)方法用于根据给定的和模式创建一个DataFrame0参数data为待转换为DataFrame的数据,可以是RDDx列表或DataFrame;参数schema(可选)为DataFrame的结构信息;参数SampIingRaiio(可选)表示自动推断结
20、构信息时所采用的数据采样比例;VerifySchema(可选)表示是否验证数据和结构信息的对应关系,默认值为True。使用ShOW()方法显示数据,如图3-16所示。hadoop()bogon-$ysparkfrompyspark.sqlimportRow怆J建RDD和字典对象student=spark.sparkContext.textFile(file:/usr/local/spark/mycoSchemaSiudent=SparkxreaieDaiaFrame(Student)schemaStudent.show()schemastudent,show()+-+nameIage+-+IM
21、ike19|ICindyj20|IJustinj19|+-+图3/6显示学生班【例34】使用编程方式定义RDD模式。DataFramC的结构可以看作是“表头”和表中数据”的组合。使用这种方式创建DataFrame的步骤可理解为使用编程定义Schema,即制作表头”;然后读取文件中的数据创建RDD,即制作“表中数据“;接着将“表头”和“表中数据”组合在一起创建DataFrame;最后显示DataFrame的数据。实现步骤如下。创建列名字符串SchemaString,包含name和age将列名字符串schemastring按空格分割成列表,并使用列表推导式创建由StructField对象组成的列表
22、fields,【高手点拨】createDataFrame(data,schema,SampIingRatio,VerifySChema)方法用于根据给定的数据和模式创建一个DataFramee参数data为待转换为DataFrame的数据,可以是RDDn歹IJ表或DataFrame;参数schema(可选)为DataFrame的结构信息;参数SamplingRatio(可选)表示自动推断结构信息时所采用的数据采样比例;VerifySchema(可选)表示是否验证数据和结构信息的对应关系,默认值为True.(详见教材)4.通过Hivc表创建DataFrameSparkSQL可以通过Hive表创建
23、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).enableHiveS
24、uppol().getOrCreate()#使用SparkSQL囱旬Hive表中的仓IJ建DataFramedf=spark.sql(SELECT*FROMmydaiabase.my_hive_table)df.show()【高手点拨】使用SqIo方法查询Hive表中的数据,要在其中引用Hive表名。Hivc表名由数据库名称和表名称组成,可以使用分隔两者。二、DataFrame的数据获取操作【教师】介绍DataFrame的数据获取操作Spark中DaiaFrame类派生于RDD类,因此对DataFrame的操作也分为转换操作和行动操作。同时,DaIaFrame也具有情性操作的特点,即只有执行行
25、动操作时才真正执行计算。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是boo
26、l型时,表示是否截断长度超过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(nul
27、lable=true) df.show()+IageIname+-+I251AliceI301BobII351Charliel+- df.show(2)+-+IageIname-I25AliceI301BobI+onlyshowingtop2rows df.show(2,False)+IageIname25AliceI30IBobI+onlyshowingtop2rows df.collect()Row(age=25.name=Alice),Row(age=30tname=Bob),Row(age=35lname=Charlie)df.head(2)Row(age三25,name=Alice)
28、,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)、商品价格(p
29、rice)、商品库存(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,1
30、00,饮品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,新建dalaF
31、rame目录,然后在该目录下新建prodUCLinfo_df.py文件,最后在该文件中编写应用程序,读取商品信息文件中的数据创建DataFrame,显示商品信息。实现步骤如下。步骤1通过SparkSession.builder创建一个SparkSession对象,并使用appName()方法指定应用程序的名称为ProdUCLinfO_df;使用masier()方法设置运行模式为本地模式local;使用geirCreaIeo方法根据构造器中的设置创建新的SparkSession对象。步骤2A制作表头.使用SIrUCtTyPeo方法定义一个包含5个字段的名为PrOdUCLSChema的Schema
32、,每个字段都是一个StructField对象,包括字段名称、字段类型和是否允许为空。步骤3A制作表中数据。使用IeXlFile()方法读取商品信息文件producl.csv中的数据创建RDD(即product.rdd),然后使用map()方法对该RDD的每行数据进行处理,将其转换为一个列表.(详见教材)【学生】自行扫码观看配套微课,按照要求进行操作,如遇问题可询问老师【教师】巡堂辅导,及时解决学生遇到的问题课堂小结【教师】简要总结本节课的要点DataFrame的创建DataFrame的数据获取操作【学生】总结回顾知识点作业布置【教师】布置课后作业(1)完成项目三项目实训中与本课相关的习题;(2)根据课堂知识,课后自己尝试DataFrame的数据获取操作,查看数据信息。【学生】完成课后任务教学反思