DataSet 简介
DataSet是分布式的数据集合,Dataset提供了强类型支持,也是在RDD的每行数据加了类型约束。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及使用了Spark SQL优化的执行引擎。DataSet可以通过JVM的对象进行构建,可以用函数式的转换(map/flatmap/filter)进行多种操作。
DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。
DataSet可以在编译时检查类型:
相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,这会浪费大量的时间,这也是引入Dataset的一个重要原因。
DataSet 使用
读取 txt 文件
person.txt
路飞 17 1 15 xxxxxxxxxxx@xxxxxxx.com
索隆 18 1 9 xxxxxxxxxxx@xxxxxxx.com
乔巴 5 1 5 xxxxxxxxxxx@xxxxxxx.com
艾斯 18 2 18 xxxxxxxxxxx@xxxxxxx.com
萨博 18 2 16 xxxxxxxxxxx@xxxxxxx.com
香克斯 32 3 30 xxxxxxxxxxx@xxxxxxx.com
3 3 30 xxxxxxxxxxx@xxxxxxx.com
null 3 3 30 xxxxxxxxxxx@xxxxxxx.com
object DataSetDemo {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("DataSetDemo").master("local[*]").getOrCreate()
import spark.implicits._
val df = spark.read.text("C:\\Users\\LUFFY\\Desktop\\testData\\person.txt")
val ds = df.as[String]
ds.map(_.split(" "))
.map(line => Person(line(0), line(1).toInt, line(2).toInt, line(3).toDouble, line(4)))
.toDF().show()
spark.stop()
}
case class Person(name: String, age: Int, deptno: Int, money: Double, email: String)
}
运行结果如下:
object DataSetDemo2 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("DataSetDemo").master("local[*]").getOrCreate()
import spark.implicits._
val ds =spark.read.text("C:\\Users\\LUFFY\\Desktop\\testData\\person.txt").as[String]
val personDF = ds.map(_.split(" ")).map(line => Person(line(0), line(1).toInt, line(2).toInt, line(3).toDouble, line(4)))
.toDF
personDF.select(personDF("name").as("姓名"), personDF("email").as("邮箱")).show(false)
}
case class Person(name: String, age: Int, deptno: Int, money: Double, email: String)
}
运行结果为:
读取 Json 文件
person.json
{"name":"路飞","age":17,"deptno":1,"money":15}
{"name":"索隆","age":18,"deptno":1,"money":9}
{"name":"乔巴","age":5,"deptno":1,"money":5}
{"name":"艾斯","age":18,"deptno":2,"money":18}
{"name":"萨博","age":18,"deptno":2,"money":16}
{"name":"香克斯","age":32,"deptno":3,"money":30}
import org.apache.spark.sql.{Dataset, SparkSession}
object DataSetDemo2 {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("DataSetDemo").master("local[*]").getOrCreate()
import spark.implicits._
val ds = spark.read.json("C:\\Users\\LUFFY\\Desktop\\testData\\person.json")
.as[Person]
ds.show()
}
case class Person(name: String, age: BigInt, deptno: BigInt, money: Double)
}
结果如下