一、作业特别说明
上一次课是静态的方式转化,这一次是动态的转换方式。
列的个数,以及每一列的具体的信息只有在运行的时候才会知道:
生产环境时候,常用的方式:动态转化,
第一:生产环境的时候,一开始不容易确定每一条记录的不同的列的元数据信息,以及这条数据到底有多少列。
第二:生产环境业务容易发生变化,数据类型容易发生变化,这样就能够应对变化的业务。可以应对来自数据库或是其他的文件,这样就不需要改动自己的代码了。
作业:使用scala方式
数据:
1,Michael,29
2,Andy,30
3,Justin,19
DataFrames
DataFrame是一个带有列名的分布式数据集合。等同于一张关系型数据库中的表或者R/Python中的data frame,不过在底层做了很多优化;我们可以使用结构化数据文件、Hive tables,外部数据库或者RDDS来构造DataFrames。
将RDD转换成DataFrames有两种方法:
利用反射来推断包含特定类型对象的RDD的schema。这种方法会简化代码并且在你已经知道schema的时候非常适用。
使用编程接口,构造一个schema并将其应用在已知的RDD上。
1)利用反射推断Schema
Spark SQL能够将含Row对象的RDD转换成DataFrame,并推断数据类型。通过将一个键值对(key/value)列表作为kwargs传给Row类来构造Rows。key定义了表的列名,类型通过看第一列数据来推断。(所以这里RDD的第一列数据不能有缺失)未来版本中将会通过看更多数据来推断数据类型,像现在对JSON文件的处理一样
2)编程指定Schema通过编程指定Schema需要3步:
1、从原来的RDD创建一个元祖或列表的RDD。
2、用StructType 创建一个和步骤一中创建的RDD中元祖或列表的结构相匹配的Schema。
3、通过SQLContext提供的createDataFrame方法将schema 应用到RDD上。
3)使用Java实战RDD与DataFrame转换
动态构造有时候有些麻烦:spark开发了一个API就是DataSet,DataSet可以基于RDD,RDD里面有类型。他可以基于这种类型。
sparkSQL+DataFrame+DataSet:三者都相当重要,在2.0的时候编码会使用大量使用DataSet。DataSet上可以直接查询。Spark的核心RDD+DataFrame+DataSet:最终会形成三足鼎立。RDD实际是服务SparkSQL的。DataSet是想要用所有的子框架都用DataSet进行计算。DataSet的底层是无私计划。这就让天然的性能优势体现出来。官方建议使用hiveContext,在功能上比SQLContext的更好更高级的功能。
4)使用Scala实战RDD与DataFrame转换
注:本学习笔记来自DT大数据梦工厂