【Spark床头书系列】Spark SparkSession由来方法示例源码分析

Spark SparkSession由来方法示例源码分析 点击这里免费看全文

由来

SparkSession是由Apache Spark项目引入的一个概念。在Spark 2.0中,它取代了旧版本中的SQLContext和HiveContext,并成为与Spark集群交互的主要入口点。

在之前的版本中,SQLContext用于执行SQL查询和操作DataFrame,而HiveContext则提供了对Hive功能的支持。然而,这种分离导致了API的冗余和不一致性。

为了解决这些问题并提供更好的用户体验,SparkSession应运而生。它将SQLContext和HiveContext的功能合并到一个统一的接口中,并提供了更多的功能和便利性。

SparkSession的目标是为用户提供一个统一且一致的编程接口,无论是进行交互式数据探索、批处理作业还是流式处理任务,都能使用相同的代码模型和API。

通过SparkSession,用户可以创建DataFrame、执行SQL查询、读写数据、注册表、管理配置等。它还提供了更多的集成选项和功能扩展,例如对结构化流处理的支持。

总之,SparkSession是Apache Spark中用于与Spark集群交互的主要入口点,提供了统一的编程接口和丰富的功能,使得数据处理更加方便和高效。

方法示例

元数据管理:

  • catalog: Catalog:用于访问Spark会话的元数据信息,如数据库、表等。
val catalog: Catalog = spark.catalog

配置管理:

  • conf: RuntimeConfig:用于获取和设置Spark会话的运行时配置。
val conf: RuntimeConfig = spark.conf
  • SQLConf.setSQLConfGetter(() => { ... }):设置自定义的SQL配置获取器。
SQLConf.setSQLConfGetter(() => spark.conf)

构建和配置:

  • Builder:用于构建和配置SparkSession对象。
val builder: SparkSession.Builder = SparkSession.builder()
val newSparkSession: SparkSession = builder.getOrCreate()

会话管理:

  • active: SparkSession:获取当前活动的Spark会话。
  • clearActiveSession(): Unit:清除当前活动的Spark会话。
  • clearDefaultSession(): Unit:清除默认的Spark会话。
  • newSession(): SparkSession:创建一个新的Spark会话。
  • getActiveSession: Option[SparkSession]:获取当前活动的Spark会话(以Option形式返回)。
  • getDefaultSession: Option[SparkSession]:获取默认的Spark会话(以Option形式返回)。
  • setActiveSession(session: SparkSession): Unit:设置当前活动的Spark会话。
  • setDefaultSession(session: SparkSession): Unit:设置默认的Spark会话。
val activeSession: SparkSession = SparkSession.active
SparkSession.clearActiveSession()
SparkSession.clearDefaultSession()
val newSession: SparkSession = SparkSession.newSession()
val activeSessionOption: Option[SparkSession] = SparkSession.getActiveSession
val defaultSessionOption: Option[SparkSession] = SparkSession.getDefaultSession
SparkSession.setActiveSession(spark)
SparkSession.setDefaultSession(spark)

数据转换和操作:

  • createDataFrame(data: java.util.List[_], beanClass: Class[_]): DataFrame:根据Java列表和指定的Bean类创建DataFrame。
  • createDataFrame(rdd: JavaRDD[_], beanClass: Class[_]): DataFrame:根据Java RDD和指定的Bean类创建DataFrame。
  • createDataFrame(rdd: RDD[_], beanClass: Class[_]): DataFrame:根据RDD和指定的Bean类创建DataFrame。
  • createDataFrame(rowRDD: JavaRDD[Row], schema: StructType): DataFrame:根据Java RDD和结构类型创建DataFrame。
  • createDataFrame(rowRDD: RDD[Row], schema: StructType): DataFrame:根据RDD和结构类型创建DataFrame。
  • createDataFrame(rows: java.util.List[Row], schema: StructType): DataFrame:根据Java列表和结构类型创建DataFrame。
  • createDataFrame[A <: Product : TypeTag](data: Seq[A]): DataFrame:根据序列数据创建DataFrame。
  • createDataFrame[A <: Product : TypeTag](rdd: RDD[A]): DataFrame:根据RDD数据创建DataFrame。
  • createDataset[T : Encoder](data: RDD[T]): Dataset[T]:根据RDD创建Dataset。
  • createDataset[T : Encoder](data: Seq[T]): Dataset[T]:根据序列创建Dataset。
  • createDataset[T : Encoder](data: java.util.List[T]): Dataset[T]:根据Java列表创建Dataset。
  • emptyDataset[T: Encoder]: Dataset[T]:创建一个空的Dataset。
import org.apache.spark.api.java.JavaRDD
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{
   IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{
   DataFrame, Dataset, Row, SparkSession}

object SparkSessionTest extends App {
   
   val spark = SparkSession.builder
    .master("local[2]")
    .appName("appName").config("", true)
    .getOrCreate()
  import spark.implicits._
  import scala.collection.JavaConverters._

//  val dataList: java.util.List[String] = List("John", "Jane").asJava
//  val df1: DataFrame = spark.createDataFrame(dataList,classOf[String])
//  df1.show()

//  val rdd: JavaRDD[Int] = spark.sparkContext.parallelize(Seq(1, 2, 3)).toJavaRDD()
//  val df2: DataFrame = spark.createDataFrame(rdd, classOf[Int])
//  df2.show()

  val data: Seq[(String, Int)] = Seq(("Alice", 25), ("Bob", 30))
  val rdd2: RDD[(String, Int)] = spark.sparkContext.parallelize(data)
  val df3: DataFrame = spark.createDataFrame(rdd2)
  df3.show()

  val rowRDD: JavaRDD[Row] = spark.sparkContext.parallelize(Seq(Row("Alice", 25), Row("Bob", 30))).toJavaRDD()
  val schema: StructType = StructType(Seq(StructField("name", StringType), StructField("age", IntegerType)))
  val df4: DataFrame = spark.createDataFrame(rowRDD, schema)
  df4.show()

  val rows: java.util.List[Row] = List(Row("Alice", 25), Row("Bob", 30)).asJava
  val df5: DataFrame = spark.createDataFrame(rows, schema)
  df5.show()


  case class Person(name: String, age: Int)
  val personData: Seq[Person] = Seq(Person("Alice", 25), Person("Bob", 30))
  val df6: DataFrame = spark.createDataFrame(personData)
  df6.show()
  val rdd3: RDD[Person] = spark.sparkContext.parallelize(personData)
  val df7: DataFrame = spark.createDataFrame(rdd3)
  df7.show()

  val intRDD: RDD[Int] = spark.sparkContext.parallelize(Seq(1, 2, 3))
  val ds1: Dataset[Int] = spark.createDataset(intRDD)
  ds1.show()

  val stringSeq: Seq[String] = Seq("John", "Jane")
  val ds2: Dataset[String] = spark.createDataset(stringSeq)
  ds2.show()


  val longList: java.util.List[Long] = List(1L, 2L, 3L).asJava
  val ds3: Dataset[Long] = spark.createDataset(longList)
  ds3.show()


  val emptyDS: Dataset[String] = spark.emptyDataset[String]
  emptyDS.printSchema()
}

+-----+---+
|   _1| _2|
+-----+---+
|Alice| 25|
|  Bob| 30|
+-----+---+

+-----+---+
| name|age|
+-----+---+
|Alice| 25|
|  Bob| 30|
+-----+---+

+-----+---+
| name|age|
+-----+---+
|Alice| 25|
|  Bob| 30|
+-----+---+

+-----+---+
| name|age|
+-----+---+
|Alice| 25|
|  Bob| 30|
+-----+---+

+-----+---+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值