Spark 2.0介绍:Dataset介绍和使用

来源:互联网 发布:mac铃声制作 编辑:程序博客网 时间:2024/06/10 23:00

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.sparkimport 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()  }}

Markdown

0 0