开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Dataset 和DataFrame 的区别_Row 对象】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12050
Dataset 和DataFrame 的区别_Row 对象
内容介绍:
一、Row 对象的操作
二、DataFrame 的作用和常见操作
前面说到 DataFrame 就是 Dataset 放 Row,由此可以说 Dataset 中可以放任意类型的对象,并且它保存有这个对象的内存信息,无论任何类型的对象将其给 DateFrame 都会被转为 Row。所以理解 Row 对象的操作就是在理解 DataFrame 的核心原理是什么?为什么要使用 row 对象。
一、Row 对象的操作
row 对象怎么去操作,通过理解 row 对象的操作再去理解 DataFrame 中为什么存放 row。
1.Row 是什么?
Row 对象表示的是一个行
Row 的操作类似于 Scala 中的 Map 数据类型
//一个对象就是一个对象
val p = People(name = "zhangsan" , age = 10)
//同样一个对象,还可以通过一个 Row 对象来表示
val row = Row ( " zhangsan" ,10)
//获取 Row 中的内容
println ( row.get(1))
println( row(1))
//获取时可以指定类型
println( row. getAs [Int](1))
//同时 Row 也是一个样例类,可以进行 match
row match {
case Row(name,age)=> println (name,age)
}
打开 IDAE 在其中创建一个新方法命名为 row
@Test
Def row( ) : Unit = {
//1.Row 如何创建,它是什么
val p =Person(“zhangsan”, 15)
//此时 person 对象表示一个人叫 zhangsan,15岁,其中就是名字列和年龄列两条数据而已。
val row =Row(“zhangsan”,15)
//row 也可以写为 person 一致,zhangsan,15岁
//此时 row 和 person 两者的区别在于 perosn 的列是有名字的叫做 name,而在 row 中并没有这个概念。row 对象必须配合 Schema 对象才会有列名,就是说 row 对象代表了一个通用的数据,其中只存放数据而不知道列名,所以需要搭配 Schema 才可以。
//2.如何从 Row 中获取数据,可以直接 getBoolean、getAS 或 getString,找到对应的类型即可,此处需使用 getString(0)和 getInt(1)其中的0,1为角标的含义,此处与数组有些类似,但数组并不能作为样例类。
row.getString(0)
row.getInt(1)
//3.Row 也是样例类,是其一大特点。
row match{ //传入一个偏函数
Case Row(name ,age ) => println(name ,age)
}
}
}
Case class Person(name,String, age : Int)
以上就是 row 的所有操作。
二、DataFrame 的作用和常见操作
1. DataFrame 是什么?
在其中介绍了 DataFrame 其实就是行加上 Schema 信息,而行就是 row 而 Schema 中就是 Schema 信息,而行加上 Schema 信息就组成了列。
DataFrame 是 SparkSQL 中一个表示关系型数据库中表的函数式抽象,其作用是让 Spark 处理大规模结构化数据的时候更加容易。一般 DataFrame 可以处理结构化的数据,或者是半结构化的数据,这两类数据中都可以获取到 Schema 信息也就是说DataFrame 中有 Schema 信息,可以像操作表一样操作 DataFrame 。
DataFrame 由两部分构成,一是 row 的集合,每个 row 对象表示一个行,二是描述DataFrame 结构的 Schema。
DataFrame 会将整个 DataFrame 数据集给表示为行和列,两部分,同时列又有类型。
如下图:
DataFrame 支持 sQL 中常见的操作,例如: select , filter , join ,group, sort,join 等。

