Spark 2.0介绍:Dataset介绍和使用
Spark2.0是Apache Spark的下一个主要版本。
此版本在架构抽象、API以及平台的类库方面带来了很大变化。
DataSet是从Spark1.6开始引入的一个新的抽象,当时还是处于alpha版本;然而在Spark2.0,它已经变成了稳定版了。
Dataset是特定域对象中的强类型集合,它可以使用函数或者相关操作并行地进行转换等操作。
每个Dataset都有一个称为DataFrame的非类型化视图,这个视图是行的数据集。
RDD也可以并行化的操作,DataSet和RDD主要的区别是:
DataSet是特定域的对象集合;
RDD是任何对象的集合。
1.创建SparkSession
val sparkSession = SparkSession.builder.
master("local")
.appName("example")
.getOrCreate()
2.读取数据并将它转换成DataSet
可以使用read.text API来读取数据,正如RDD版提供的textFile,as[String]可以为dataset提供相关的模式
import sparkSession.implicits._
val data = sparksession.read.text("").as[String]
上面data对象的类型是DataSet[String],我们需要引入sparkSession.implicits._
3.分割单词并且对单词进行分组
DataSet提供的API和RDD提供的非常类似,所以也可以在DataSet对象上使用map.groupByKey相关的API
val words = data.flatMap(value => value.split("\\s+"))
val groupedWords = words.groupByKey(_.toLowerCase)
DataSet是工作在行级别的抽象,每个值将被看做带有多列的行数据,而且每个值都可以看做是group的key
4.计数
一旦我们有了分组好的数据,我们可以使用count方法对每个单词进行计数,正如在RDD上使用reduceByKey
val counts = groupedWords.count()
5.打印结果
counts.show()
SparkDemo
package com.lmbang.spark
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.log4j._
object SparkDemo {
def main(args: Array[String]) {
Logger.getLogger("org").setLevel(Level.ERROR)
// 1.创建SparkSession
val sparkSession = SparkSession.builder().master("local").appName("Demo").getOrCreate()
// 2.读取数据并将它转换成DataSet
import sparkSession.implicits._
val data = sparkSession.read.text("F:\\IdeaProjects\\Ngram\\resource\\aa.txt").as[String]
// val data = sparkSession.read.text("F:\\IdeaProjects\\Ngram\\resource\\u.user").as[String].map { line => Row(line.split("\\|")(0).toString, line.split("\\|")(1).toString, line.split("\\|")(2).toString, line.split("\\|")(3).toString, line.split("\\|")(4).toString) }
// data.toDF()
// 3.分割单词并且对单词进行分组
val words = data.flatMap(value => value.split(" "))
val groupedWords = words.groupByKey(_.toLowerCase)
// 4.计数
val counts = groupedWords.count()
// 5.打印结果
counts.show()
}
}