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的使用和对数据的操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值