




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
BigDataAnalyticswithSpark项目四SparkSQL处理结构化学生数据项目概述SparkSQL是Spark生态中用于处理结构化数据的一个模块,开发人员可以轻松的借助API、SQL语句完成数据分析工作。SparkSQL支持多种数据源,实际开发中经常要读写MySQL数据库及Hive数据仓库,本项目从DataFrame的创建入手,介绍不同的DataFrame的创建方法及DataFrame的各种操作。针对某校的学生信息文件(含学院、姓名、性别、年龄等),使用SparkSQL进行分析,获取分析结果;项目效果使用SparkSQL可以完成学生信息的分析,提取有价值的信息。例如分学院、性别统计年龄最大、最小值,如下所示:除此之外,还可以实现与SparkSQL与MySQL、Hive的连接。利用SparkSQL技术完成数据分析后,结果可再次写入到MySQL、Hive中,如下所示:目录任务1初识结构化数据处理工具SparkSQL认识DataFrame、DataSet数据类型由学生信息创建DataFrameSparkSQL分析学生信息(1)任务2任务3任务4SparkSQL分析学生信息(2)任务5任务6SparkSQL分析学生信息(3)目录任务7SQL语法风格处理学生信息通过JDBC连接MySQL数据库任务9RDD、DataFrame与Dataset的相互转换其他类型数据创建DataFrame任务11SparkSQL读写Hive数据任务8任务10思维导图初识结构化数据处理工具SparkSQL任务1SparkSQL是Spark体系中处理结构化数据的有力工具。初步认识SparkSQL,了解其演化历程、特点,并初步体验其使用过程。早期Hadoop生态体系中,数据处理主要使用MapReduce组件。缺陷:MapReduce学习成本较高、需要较多的Java编程等知识。后续产生了Hive分布式数据仓库,它允许用户使用类似于SQL的语法(HQL)处理结构化数据,极大降低了使用门槛;Hive与Hadoop高度集成,将HQL语言自动换成MapReduce操作,可使用Yarn完成资源调度,最终完成结构化数据的处理任务;因其便捷性,Hive逐渐流行起来,成为搭建分布式数据仓库的主流方案之一。缺陷:其底层基于MapReduce(HQL最终转换为MapReduce操作),而MapReduce的shuffle需要大量的磁盘I/O,因此导致Hive的性能低下,复杂的操作可能运行数个小时,甚至数十个小时。为此,伯克利实验室开发了基于Hive的结构化数据处理组件Shark(SparkSQL的前身)。Shark是Spark上的数据仓库,最初设计成与Hive兼容;Shark在HiveQL方面重用了Hive中的HiveQL解析、逻辑执行计划翻译、执行计划优化等逻辑,但在执行层面将MapReduce作业替换成了Spark作业(把HiveQL翻译成Spark上的RDD操作)。因此与Hive相比,因其使用Spark的基于内存的计算模型,性能得到了极大提升。缺陷:一是执行计划优化完全依赖于Hive,对于其性能进一步提升造成了约束;二是Spark是线程级并行,而MapReduce是进程级并行,Spark在兼容Hive的实现上存在线程安全问题。此外,Shark继承了大量的Hive代码,因此后续优化、维护较为麻烦,特别是基于MapReduce设计的部分,成为整个项目的瓶颈。因此,2014年Shark项目中止,并转向SparkSQL的开发。1.1SparkSQL的产生早期,SparkSQL引入了SchemaRDD(即带有Schema模式信息的RDD),使用户可以在SparkSQL中执行SQL语句,数据既可以来自RDD,也可来自Hive、HDFS、Cassandra等外部数据源,还可以是JSON、Parquest、CSV等格式的数据。开发语言方面,SparkSQL支持Scala、Java、Python等语言,支持SQL-92规范。从Spark1.2升级到Spark1.3以后,SparkSQL中的SchemaRDD改为DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多便捷的API。SparkSQL可以使用JDBC、ODBC等标准数据库连接器,友好的支持各种SQL查询;这样其他第三方工具,如部分商业智能工具(PowerBI、Tableau等)可以接入Spark,借助Spark的强大计算能力完成大规模数据的处理。1.2
SparkSQL的特点在早期的Spark1.X版本中,Spark结构化数据处理的入口为SQLContext和HiveContext;其中,SQLContext仅支持SQL语法解析器,而HiveContext继承了SQLContext,HiveContext即支持SQL语法解析器又支持HiveQL语法解析器。Spark2.0版本之前,使用Spark必须先创建SparkContext,SparkContext是程序入口和程序执行的“调度者”;下面代码演示Spark1.X版本下,依次创建SparkConf、SparkContext、SQLContext实例://创建SparkConf实例valsparkConf=newSparkConf().setAppName("SparkSessionZipsExample").setMaster("local")//创建SparkContext实例valsc=newSparkContext(sparkConf)//创建SQLContext实例valsqlContext=neworg.apache.spark.sql.SQLContext(sc)1.3体验SparkSQL不同版本的操作差异在Spark2.0以后版本中,只要创建一个SparkSession实例就够了,SparkConf、SparkContext和SQLContext都已经被封装在SparkSession当中(SparkSession是程序入口、SparkSQL的上下文环境);HiveContext类已经被移除,其功能迁移到SparkSession类中。下面代码演示Spark2.X版下,通过SparkSession实例访问SparkContext实例和SQLContext实例://创建SparkSession实例valspark=SparkSession.builder().appName("SparkSQLExample").getOrCreate()//由SparkSession创建SparkContext、SQLContext实例valsc=spark.sparkContextvalsqlContext=spark.sqlcontext注意,在SparkShell环境下,已经建好了一个SparkSession对象spark,可以直接使用;但在独立应用程序中,则需要手工建立。1.3体验SparkSQL不同版本的操作差异认识DataFrame、DataSet数据类型任务2Spark可将RDD封装为DataFrame、DataSet,支持SQL类的操作。介绍DataFrame、Dataset数据类型,认识RDD、DataFrame、Dataset三者的区别。SparkSQL中DataFrame是其核心数据抽象,其前身是SchemaRDD(Spark1.3中首次引入DataFrame的概念)。DataFrame借助Schema(模式信息)将数据组织到一个二维表格中(类似于关系型数据库的表),每一列数据都存在列名。基于RDD进行数据分析时,因为RDD的不可修改性,为了得到最终结果,需要进行若干次转换、生成若干RDD;用DataFrame进行分析时,一条SQL语句也可能包含多次转换,但转换操作在其内部发生,并不会频繁产生新的RDD,从而获得更高的计算性能。2.1认识DataFrameDataFrame与RDD的主要区别在于,前者带有schema信息,即DataFrame所表示的二维表数据集的每一列都带有名称和数据类型。这使得SparkSQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行效率的目的。反观RDD,由于无法得知其元素的具体内部结构,SparkCore只能在stage层面进行简单、通用的流水线优化。如图4-6所示,假设有若干人员Person数据,包含name、age两项信息。若用RDD进行处理,则需要定义个Person类,将用户数据封装到Person类型对象中,RDD的每一个元素都是Person类型,而Spark并不清楚其内部结构。如果要把数据存放到DataFrame中,则每一个元素都会被封装为Row类型,DataFrame提供了详细的结构信息,SparkSQL可以清楚地知道该数据集中包含多少列、每列的名称和数据类型,如图4-6所示。2.1认识DataFrameDataset是DataframeAPI的一个扩展,是Spark1.6版本加入的新的数据抽象,也是Spark2.0之后管理结构化数据的主要数据抽象。Dataframe是Dataset的特列,DataFrame=Dataset[Row],Row是一个类型,跟Car、Person这些的用户定义类型一样,所有的表结构信息都用Row来表示。DataSet是强类型的,可以有Dataset[Car]、Dataset[Person]等,而DataFrame的每一行数据则只能为Row类型。除此之外,DataFrame只是知道字段,但不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的;比如对一个String进行减法操作,编译时不会报错,在执行的时候才报错;而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。2.2认识Dataset如下所示,对于人员Person数据,可以自行创建一个Person样例类(caseclassPerson(name:String,age:Int)),而后将每个人的数据封装为一个Person对象,最后放入Dataset中;即Dataset的每一行都是一个Person类实例。这种形式更加符合面向对象编程的思路,更加贴合业务场景,便于处理业务中的数据关系。2.2认识DatasetRDD中,明确知道每个元素的具体类型,但不知道元素的具体属性,需要加以判别。DataFrame中,每一个元素(每一行)均为Row类型,可以知道每个元素有多少列,每列的名称是什么,但不知道每列的数据类型。DataSet集成了RDD和DataFrame的优点,可以明确知道每一个元素(每一行)的具体类型(预先定义的类),进而知道每列数据的名称,也知道其数据类型;在Spark2.X版,DataSet、DataFrame的API已做了统一。2.3RDD、DataFrame、Dataset三者的区别由学生信息创建DataFrame任务3要使用SparkSQL进行数据分析,创建DataFrame;由JSON数据文件构建DataFrame以供后续处理DataFrame的相关数据输出、打印等方法。结构化文件(JSON,CSV,Parquest等)、数据库(mysql、Oracle等)、分布式数据库等均可以生成DataFrame,从而进行数据处理。下面演示由JSON文件创建DataFrame,其他生成方式,后续陆续讲解。首先在Linux终端中,使用以下命令将people.json文件上传到hadoop文件系统:然后使用spark.read.json(“文件路径”)或spark.read.format("json").load(“文件路径”)形式创建DataFrame,如下所示(代码中spark为SparkShell自动生成的SparkSession对象):3.1由学生信息JSON文件创建DataFrame./hdfsdfs-put/home/hadoop/people.json/user/hadoopSparkDataFrame类派生于RDD类,因此与RDD类似,DataFrame的操作也分为转换操作和行动操作,同时DataFrame也具有惰性操作特点(只有提交行动操作时才真正执行计算)。SparkRDD经常用take、collect等行动操作查看数据,DataFrame同样提供了若干类似方法,常用的方法如下所示。3.2printSchema打印DataFrame的数据模式使用printSchema打印DataFrame的数据模式,可以看到df的列名称、数据类型以及是否可以为空。3.2printSchema打印DataFrame的数据模式show相关方法有多个,常用的如下所示3.3show方法显示DataFrame、中的数据(1)show方法默认显示20行3.3show方法显示DataFrame中的数据(2)show(numRows:Int)显示前numRows行3.3show方法显示DataFrame中的数据(3)show(5,false),显示5行、显示全部字符3.3show方法显示DataFrame中的数据(1)first获取DataFrame第一行数据,返回值类型为org.apache.spark.sql.Row(2)head获取DataFrame首元素,返回值类型为org.apache.spark.sql.Row3.4获取DataFrame若干行记录(3)take(numRows:Int),获取numRows行数据,返回值类型为Array[org.apache.spark.sql.Row]。(4)takeAsList(numRows:Int),获取numRows行数据,返回值类型为java.util.List[org.apache.spark.sql.Row]。3.4获取DataFrame若干行记录(1)collect获取DataFrame的所有记录,返回值类型为Array[org.apache.spark.sql.Row]3.5获取DataFrame所有记录(2)collectAsList获取DataFrame的所有记录,返回值类型为java.util.List[org.apache.spark.sql.Row]。3.5获取DataFrame所有记录SparkSQL
分析学生信息(1)
任务4where、filter、select等操作而进一步分析学生信息。where方法主要用于筛选出符合条件的行,它有两种参数形式。(1)参数为条件字符串(conditionExpr:String),方法定义如下所示,用于筛选出符合conditionExpr条件的数据,其返回值类型为org.apache.spark.sql.Dataset。例如,要筛选出年龄大于21岁的学生信息,实现代码如下所示。4.1where方法在条件语句conditionExpr中,可以使用and、or等连接词;例如要找出人文学院或机械学院的男生信息,代码如下所示。(2)参数为condition:Column条件,方法定义如图4-23所示,其返回值类型为org.apache.spark.sql.Dataset。4.1where方法下图为找出年龄大于20的学生信息;其中,$”age”表示age这一列。4.1where方法filter方法与where方法类似,下图筛选出信息学院年龄大于20的学生信息。4.2
filter筛选相关数据4.3
select方法select方法用于选择特定列生成新的Dataset,有多重参数形式,可以用String参数,也可以用Column列参数。如下所示,其中,df(“institute”)、df(“age”)为org.apache.spark.sql.Column对象。selectExpr方法定义如下所示,可以对选定的列进行特殊处理(例如改列名、取绝对值、四舍五入等),最终返回一个新的DataFrame。“instituteasschool”使用as将列“institute”重命名为“school”;“round(age+0.52,2)”将age列值加0.52后,四舍五入保留2位小数。4.4
selectExpr方法对于selectExpr,也可以采用以下写法:4.4
selectExpr方法可以用col()、apply()方法均可获取指定的列,返回值类型为org.apache.spark.sql.Column;也可以使用df("name")形式得到Column。4.5取指定的Columndrop方法可去掉指定列,返回新的DataFrame。4.6去掉指定的列SparkSQL
分析学生信息(2)任务5orderBy排序、groupBy分组、distinct去重、join连接操作等进一步分析学生数据。limit获取DataFrame的前N行;与take方法不同,limit方法返回值为类型为Dataset。5.1limit获取前N行orderBy、sort均可用于排序,二者等效、用法基本一致;下面以orderBy为例讲解,orderBy方法有多重用法:(1)orderBy("age"),参数为String,按照age升序排列5.2orderBy、sort排序
(2)参数为Column,结合asc、desc进行升序或降序排列。5.2orderBy、sort排序
(3)orderBy中可以设置多个参数,进行多字段组合排序。5.2orderBy、sort排序
groupBy为分组操作,其返回值类型为RelationalGroupedDataset,后续经常与count、mean、max、min、sum等操作合用。如下所示,df按照“institute”分组,得到一个RelationalGroupedDataset实例。5.3
groupBy分组操作(1)使用count,按学院统计学生人数,如下所示。5.3
groupBy分组操作(2)使用mean,按学院统计平均年龄,如下所示。(3)按学院、性别统计平均年龄,如下所示。(4)按学院、性别统计学生年龄最大值,如下所示。5.3
groupBy分组操作(1)distinct方法用于删除DataFrame中的重复行。下图中,创建含有重复元素的df2(createDataFrame方法将在后续任务中讲解);然后,使用distinct方法去重,如下所示。5.4distinct去重操作(2)dropDuplicates可以根据指定的字段进行去重。例如根据institute、sex两列进行去重,最终每个学院、男女生各保留一名学生。5.4distinct去重操作agg聚合操作常用于部分数据列的统计,也可以与groupBy组合使用,从而实现分组统计的功能;下面通过几个例子演示agg的使用方法。(1)统计所有学生年龄的最大、最小、平均值。(2)统计所有学生年龄的最大、最小、平均值(第二种写法)5.5agg聚合操作(3)统计所有学生年龄的加和、手机号码最大值(4)与groupBy组合使用,分学院统计年龄最大值、最小值5.5agg聚合操作join操作用于连接连个DataFrame组成一个新的DataFrame;下面创建两个DataFrame:df1、df2,演示内连接join操作的效果。join操作也可以写成如下形式,达到的效果基本一致,但join后产生的DataFrame的列数量不同、显示效果有所差别(df3有3列,而df4有4列)。5.6join连接操作SparkSQL
分析学生信息(3)任务6stat用于制定字段统计、intersection获取两个DataFrame的共有记录、na处置DataFrame中的空值等。进一步分析学生信息。直接执行SQL语句的方法。
stat方法可以用于计算指定字段或字段间的统计,stat方法返回DataFrameStatFunctions类型对象;DataFrameStatFunctions又可以调用接口freqItems(找出频繁出现的元素)、corr(两列的相关性)、cov(两列的协方差)等。(1)freqItems找出“age”、“institute”列中频繁出现的元素。(2)corr求“age”、“phone”两列的相关性。6.1stat方法获取指定字段统计信息(3)cov求两列的协方差6.1stat方法获取指定字段统计信息intersect方法用于获取两个DataFrame的共有记录(交集);用createDataFrame方法创建两个DataFramedf1、df2,而后使用intersect方法获取df1、df2的的共有记录。6.2intersect方法获取两个DataFrame共有记录(1)withColumnRenamed重命名指定的列字段名称;下图中,使用withColumnRenamed方法将列名改为“school”。6.3操作字段名(2)wihtColumn方法可在当前DataFrame中增加一列(该列可来源于自身,但不能为其他DataFrame)下图中,df使用wihtColumn方法增加一列,它是在原先age列df(“age”)基础上,+1得来。6.3操作字段名SparkSQL中,经常用na方法处置空值,其返回值类型为DataFrameNaFunctions;而DataFrameNaFunctions有drop、fill等方法具体处理空值。为演示na方法处理空值,由JSON文件people_null_values.json创建DataFrame;注意第二行sex、第三行数据institute数据缺失。6.4处置空值(1)drop方法用于删除含有空值的行,只要行数据中含有空值(Null),就删除该行。下图中,首先由people_null_values.json生成DataFrame(df2),而后使用na、drop方法删除含有空值的行。6.4处置空值(2)对于给定的列,如果有数值为空,删除空数值所在的行;下图中,使用drop方法删除sex或institute为空值的行。6.4处置空值(3)fill方法用指定的值来代替空值;下图中,对于sex为空的值填充为“男”,对于“institute”为空的值填充为“艺术学院”6.4处置空值SQL语法风格处理
学生信息任务7直接使用SQL语句完成数据分析任务。采用SQL语法风格处理学生信息。SparkSQL操作包括DSL和SQL两种语法风格;其中DSL(DomainSpecificLanguage)领域专用语言,其目的是帮助开发者调用特定的方法实现与SQL语句相同的功能,前面关于DataFrame的操作均为DSL操作。DSL语法类似于RDD中的操作,允许开发者调用相关方法完成对DataFrame数据分析;DSL风格更符合面向对象编程的思想,可以避免不熟悉SQL语法带来的麻烦。除了DSL,SparkSession提供了直接执行SQL语句的sql(sqlText:String)方法;该方法以SQL语句为参数,返回一个DataFrame对象。熟悉SQL语法的开发者,可以直接使用SQL语句进行数据分析,可进一步降低学习门槛。7.1SparkSQL中的DSL风格与SQL风格7.2创建临时视图要想使用SQL语句,需要将DataFrame对象注册为一个临时视图;临时视图分为会话临时视图(TempView)和全局临时视图(GlobalTempView)两种,创建方法如下图所示。其中,会话临时视图作用域仅限于当前会话,每个会话内的临时视图不能被其他会话所访问;而全局临时视图与当前Spark应用程序绑定,当前应用程序内的所有SparkSession实例中均可访问,即全局临时视图可以实现不同会话直接的共享。createTempView、createOrReplaceTempView均可以创建会话临时视图,但二者亦有区别:前者创建视图时,如果该视图已经存在(已经创建过),则会抛出异常;后者创建视图时,如果视图已经存在,则用自己新创建的视图代替原临时视图。创建了临时视图后,可以调用SparkSession的sql(sqlText:String)方法,执行各种SQL操作。如下图所示,找出年龄大于20岁的学生信息,输出其name、age、school(institute别名)。7.3按条件查找学生信息(1)分组统计各学院学生数量,可以在SQL语句中使用count、groupby。(2)分学院、性别统计学生年龄最大、最小值,在SQL语句中可以使用max、min、groupby。7.4分组统计学生信息虽然SparkSQL提供了很多内置函数,但在实际生产环境中,仍然有不少场景是内置函数无法支持的(或实现较为复杂),这时就需要开发人员自定义函数来满足要求。例如对于学生信息中的年龄,需要输出学生是否成年(年龄大于20为成年人adult,小于20为未成年minor)。7.5用户自定义函数判断学生是否成年其他类型数据创建DataFrame任务8小规模数据测试时可以将内存数据创建DataFrame。JSON、CSV、Parquet等文件创建DataFrame。与RDD类似,用户可以根据内存中的数据生成DataFrame。Spark允许使用createDataFrame方法,将有序集合创建DataFrame;在此过程中,可以使用Spark的类型推断机制来确定DataFrame每列的数据类型。8.1内存数据创建DataFrame首先创建一个List,而后通过spark.createDataFrame(peopleList)生成DataFrame(peopleDF);在此过程中,Spark的类型推断机制确定了各列的数据类型;但通过打印输出可以发现,生成的peopleDF列名称默认为_1、_2、_3;可以使用toDF方法为各列指定名称。8.1内存数据创建DataFrameJSON文件创建DataFrame可直接使用SparkSession的read方法完成,具体有两种写法。8.2JSON数据创建DataFrame对于CSV文件,可以采用类似处理JSON文件方式读取;但CSV文件一般需要设置option选项;现有CSV文件authorWithTile.csv,由该文件生成DataFrame,代码如下所示;其中,option("sep",",")表示分隔符为“,”,option("inferSchema","true")表示Spark自动推断各列的数据类型,option("header","true")表示CSV文件第一行作为列的名称。8.3CSV数据创建DataFrameParquet是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录。Parquet是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件,无论是Hive、Impala、Pig等查询引擎,还是MapReduce、Spark等计算框架,均可以跟Parquet密切配合完成数据处理任务。Spark加载数据和输出数据支持的默认格式为Parquet;Spark已经为用户提供了parquet样例数据,在Spark安装目录下有“/examples/src/main/resources/users.parquet”文件;注意parquet文件是不可以人工直接阅读的,如用gedit打开或者cat查看文件内容,都会显示乱码。只有被加载到程序中以后,Spark会对这种格式进行解析,然后我们才能看到其中的数据;由parquet文件数据生成DataFrame如下所示。8.4Parquet数据创建DataFrameDataFrame的数据根据需要可以输出到Parquet、JSON、CSV等文件中(Spark推荐Parquet文件);下图展示了将DataFrame保存到不同文件的方法。注意在保存为CSV文件时,也可以附带一定option选项,如option("header",true)表示保存为CSV文件时,第一行为列的标题。8.5DataFrame数据保存到文件中RDD、DataFrame与Dataset的相互转换任务9RDD转换为DataFrame,使用DataFrame的丰富的API,或者执行更加简便的SQL查询。RDD、DataFrame、Dataset的相互转换。SSparkSQL允许将元素为样例类对象的RDD转换为DataFrame;样例类的声明中预先定义了表的结构信息(列名、数据类型),代码执行过程中通过反射机制读取case类的参数名为列名。现有bigdata_result.txt文件,记录了学生的信息及大数据考试成绩,其结构如下所示。9.1使用反射机制由RDD生成DataFrame将bigdata_result.txt置于/home/hadoop目录下,可以通过如下代码完成从RDD到DataFrame的转换。上述代码中,首先定义了样例类caseclassResult,然后读取bigdata_result.txt文件创建了RDD,并使用map操作将其元素转换为Result对象;最后使用toDF方法,将RDD转为DataFrame。9.1使用反射机制由RDD生成DataFrameSSparkSQL允许将元素为样例类对象的RDD转换为DataFrame;样例类的声明中预先定义了表的结构信息(列名、数据类型),代码执行过程中通过反射机制读取case类的参数名为列名。9.1使用反射机制由RDD生成DataFrame当无法提前定义caseclass时,可以采用编程指定Schema的方式将RDD转换成DataFrame。现有people.txt文件,记录了people的姓名、年龄、性别信息,如下所示;由该文件生成DataFrame过程包括3个步骤。9.2以编程方式由RDD生成DataFrame(1)生成Shema(即“表头”结构信息),包含字段名称、字段类型和是否为空信息等信息。SparkSQL提供了StructType(fields:Seq[StructField])类来代表模式信息Schema。其中fields是一个集合,该集合中每一个元素均为StructField对象;StructField(name,dataType,nullable)用来表示表的字段信息,其中name表示字段名称,dataType表示字段类型,nullable表示是否可以为空,下图为制作表头Schema的过程。9.2以编程方式由RDD生成DataFrame(2)生成表中的记录(行),要求表中每一行(即RDD的每一个元素)均为Row类型。9.2以编程方式由RDD生成DataFrame(3)有了schema表头及表中记录后,使用createDataFrame方法将其组合在一起,构建一个DataFrame。9.2以编程方式由RDD生成DataFrameDataFrame转换为RDD比较简单,只需调用rdd方法即可。9.3DataFrame转为RDDSpark中,如果Dataset[T]中的T为Row类型,则Dataset[T]等价于DataFrame;下面介绍T泛型不为Row类型时,Dataset与DataFrame的转换。(1)将DataFrame转换为Dataset9.4DataFrame与Dataset之间的转换(2)toDF方法将Dataset转换为DataFrame9.4DataFrame与Dataset之间的转换通过JDBC连接MySQL数据库任务10通过JDBC,SparkSQL可以实现与MySQL等数据库的互联互通现SparkSQL读写MySQL数据库表中数据,经过处理后的数据再写入MySQL。SparkSQL连接MySQL数据库,需要启动MySQL数据库、创建数据库及表等操作。(1)安装MySQL数据库并启动在Ubuntu环境下,使用命令“sudoapt-getinstallmysql-server”即可完成MySQL数据库的安装,安装过程可能需要输入root用户密码等;具体安装过程可查找相关书籍或网络文档。使用命令servicemysqlstart启动MySQL数据库,而后使用命令mysql-uroot-p输入root用户密码后连接到MySQL。10.1准备工作接下来创建数据库sparkTest、数据库表people,并向表中插入3行数据,代码如下10.1准备工作createdatabasesparkTest;usesparkTest;createtablepeople(idchar(10),namechar(20),sexchar(10),ageint(4),addresschar(50));insertintopeoplevalues('101','Tom','male',20,'Zhuhai,Guangdong');insertintopeoplevalues('102','Merry','female',21,'Shenzhen,Guangdong');insertintopeoplevalues('103','Ken','male',19,'Shenzhen,Guangdong');select*frompeople;要想使用JDBC连接MySQL,需要下载JDBC驱动包(本教程将JDBC为mysql-connector-java-8.0.13.jar),将其放置于目录/usr/local/spark/jars/下;然后Linux终端输入以下命令后进入spark-shell环境:10.1准备工作cd/usr/local/spark/bin./spark-shell\--jars/usr/local/spark/jars/mysql-connector-java-8.0.13.jar\--driver-class-path/urs/local/spark/jars/mysql-connector-java-8.0.13.jarspark.read.format("jdbc")用于实现对MySQL数据库的读取操作,执行如下代码,可以读取sparkTest数据库中的people表,并生成DataFrame。10.2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 单位音响租赁合同范本
- 医院科室安装监控合同范本
- 企业融资顾问协议合同范本
- 出售房屋合同范本
- 农村鱼塘拆除合同范本
- 全购销合同范本
- 武汉工装合同范本
- 出租预混料工厂合同范本
- 公司车租赁合同范本
- 劳动合同范本1995
- 《商务沟通-策略、方法与案例》课件 第三章 书面沟通
- 2024具身大模型关键技术与应用报告-哈尔滨工业大学
- 提高瓦屋面太阳能板安装一次验收合格率
- 混凝土工安全教育培训试题及答案
- 临床家庭化产房开展经验分享
- 2024上海市房屋租赁合同范本下载
- 安徽省六安市裕安区六安市独山中学2024-2025学年高一上学期11月期中生物试题(含答案)
- CSC资助出国博士联合培养研修计划英文-research-plan
- 我的物品我做主班会
- 低血糖的护理查房
- GB/T 44718-2024城市轨道交通无障碍运营服务规范
评论
0/150
提交评论