SparkSession解释

创建SparkSession

Spark2.0中引入了SparkSession的概念,它为用户提供了一个统一的切入点来使用Spark的各项功能,用户不但可以使用DataFrame和Dataset的各种API,学习Spark2的难度也会大大降低。


SparkSession-Spark的一个全新的切入点

在Spark的早期版本,sparkContext是进入Spark的切入点。我们都知道RDD是Spark中重要的API,然而它的创建和操作得使用sparkContext提供的API;对于RDD之外的其他东西,我们需要使用其他的Context。比如对于流处理来说,我们得使用StreamingContext;对于SQL得使用sqlContext;而对于hive得使用HiveContext。然而DataSet和Dataframe提供的API逐渐称为新的标准API,我们需要一个切入点来构建它们,所以在 Spark 2.0中我们引入了一个新的切入点(entry point):SparkSession

SparkSession实质上是SQLContext和HiveContext的组合(未来可能还会加上StreamingContext),所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的。

早期版本:在2.0版本之前,使用Spark必须先创建SparkConf和SparkContext,代码如下:

//设置SparkConf配置参数,并创建SparkContext对象
val sparkConf = new SparkConf().setAppName("my_spark_app").setMaster("local")
val sc = new SparkContext(sparkConf).set("spark.some.config.option", "some-value")
// 操作数据集通过sqlContext 对象
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

现在版本
不过在Spark2.0中只要创建一个SparkSession就够了,***SparkConf、SparkContext***和***SQLContext***都已经被封装在SparkSession当中。下面的代码创建了一个SparkSession对象并设置了一些参数。这里使用了生成器模式,只有此“spark”对象不存在时才会创建一个新对象。

//创建 SparkSession对象:别名是spark,(此时不用再创建sparkContext)

val sparkSession= SparkSession.builder()
 .master("local")
.appName("SparkSession_Example")
.config("spark.sql.warehouse.dir", warehouseLocation)  //可选
.getOrCreate()

执行完上面的代码就可以使用spark对象了。(实际是SparkSession对象)

上面代码类似于创建一个SparkContext,master设置为local,然后创建了一个SQLContext封装它。如果你想创建hiveContext,可以使用下面的方法来创建SparkSession,以使得它支持Hive:

val sparkSession= SparkSession.builder()
 .master("local")
.appName("SparkSession_Example")
.config("spark.sql.warehouse.dir", warehouseLocation)  //可选
.enableHiveSupport()   //可选,表示支持Hive操作,默认创建时候是支持()
.getOrCreate()

enableHiveSupport 函数的调用使得SparkSession支持hive,类似于HiveContext。

读取JSON数据

此外,还可以用SparkSession读取JSON、CSV、TXT和parquet表。下面的代码中读取了一个JSON文件,返回的是一个DataFrame。

// read the json file and create the dataframe
val jsonFile = "file:\\dirPath"
val zipsDF = sparkSession.read.json(jsonFile)
//过滤出人口大于40000的数据
zipsDF.filter(zipsDF.col("pop") > 40000).show(10)

使用SparkSession读取本地数据:(以csv文件为例)

创建完SparkSession之后,我们就可以使用它来读取数据,下面代码片段是使用SparkSession来从csv文件中读取数据:

val df = sparkSession.read.option("header","true").
    csv("src/main/resources/sales.csv")

上面代码非常像使用SQLContext来读取数据,我们现在可以使用SparkSession来替代之前使用SQLContext编写的代码。下面是完整的代码片段:

package com.iteblog
import org.apache.spark.sql.SparkSession
/**
  * Spark Session example
  */
object SparkSessionExample {
  def main(args: Array[String]) {
    val sparkSession = SparkSession.builder.
      master("local")
      .appName("spark session example")
      .getOrCreate()
    val df = sparkSession.read.option("header","true").csv("src/main/resources/sales.csv")
    df.show()
 
  }
 
}

使用SparkSQL

借助SparkSession用户可以像SQLContext一样使用Spark SQL的全部功能。下面的代码中先创建了一个表然后对此表进行查询。

// Now create an SQL table and issue SQL queries against it without
// using the sqlContext but through the SparkSession object.
// Creates a temporary view of the DataFrame
zipsDF.createOrReplaceTempView("zips_table")
zipsDF.cache()
val resultsDF = sparkSession.sql("SELECT city, pop, state, zip FROM zips_table")
resultsDF.show(10)

存储/读取Hive表

下面的代码演示了通过SparkSession来创建Hive表并进行查询的方法。

//drop the table if exists to get around existing table error
sparkSession.sql("DROP TABLE IF EXISTS zips_hive_table")
//save as a hive table
sparkSession.table("zips_table").write.saveAsTable("zips_hive_table")
//make a similar query against the hive table
val resultsHiveDF = sparkSession.sql("SELECT city, pop, state, zip FROM zips_hive_table WHERE pop > 40000")
resultsHiveDF.show(10)

SparkSession和SparkContext

下图说明了SparkContext在Spark中的主要功能

在这里插入图片描述

小结:

从图中可以看到SparkContext起到的是一个中介的作用,通过它来使用Spark其他的功能。每一个JVM都有一个对应的SparkContext,driver program通过SparkContext连接到集群管理器来实现对集群中任务的控制。Spark配置参数的设置以及对SQLContext、HiveContext和StreamingContext的控制也要通过SparkContext进行。

不过在Spark2.0中上述的一切功能都是通过SparkSession来完成的,同时SparkSession也简化了DataFrame/Dataset API的使用和对数据的操作。


猜你喜欢

转载自blog.csdn.net/fct2001140269/article/details/82981170