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

Spark之SparkSession 最近学习SparkSql时接触了SparkSession。SparkSession是Spark 2.0引如的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。   在spark的早期版本中,SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于每个其他的API,我们需要使用不同的 阅读详情

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|
+-----+---+

+-----+---+
| name|age|
+-----+---+
|Alice| 
解决java+Spark进行数据去重的具体操作步骤 数据去重是处理大数据的一个常见任务,可以帮助我们快速识别和删除重复的数据行。然后,我们可以使用SparkSession来加载我们的数据。在上述代码中,我们调用了dropDuplicates()方法来对数据进行去重操作,并将结果保存在一个新的Dataset对象中。一旦我们加载了数据,我们就可以执行数据去重操作了。在上面的代码中,我们调用了write().csv()方法来将去重后的数据保存为CSV格式,并指定了输出路径。现在,你可以将数据去重的代码封装在一个可执行的Java程序中,并运行它来实现数据去重。 阅读详情

相关推荐

Spark | 基于源码解析SparkSession初始化过程

Spark.version: 2.4.4 Apache Spark 2.0引入了SparkSession,其为用户提供了一个统一的切入点来使用Spark的各项功能,例如不再需要显式地创建SparkConf, SparkContext 以及 SQLContext,因为这些对象已经封装在SparkSession中。另外SparkSession允许用户通过它调用DataFrame和Dataset相关API来编写Spark程序。 其次SparkSession通过生成器设计模式(Builder Design Pa

俗人 4782

【FOC无刷电机控制】六步换向、FOC,STM32cubemx从零开始搭建BLDC六步换相代码、FOC代码(基于霍尔传感器)

FOC、六步换相,无刷电机控制

xifan的博客 3万+

L298N电机驱动模块的接线使用与代码实现

#include "iostm8s208mb.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; // 关于LED灯的宏定义 #define LED2 PI_ODR_ODR2 //输出量 #define LE

Clichong 13万+

别再到处找模型了!手把手教你用Xinference+Docker部署本地私有大模型(Llama2/Qwen实战)

本文详细介绍了如何使用Xinference和Docker部署本地私有化大模型(如Llama2/Qwen),涵盖硬件配置、模型管理、Docker部署及性能优化等关键步骤。通过实战案例,帮助开发者快速构建企业级AI推理服务,确保数据安全与高效运行。

weixin_28683065的博客 232

坐标偏移不一致或瓦块重名的多个OSGB工程的融合

介绍如何使用实景三维小助手OSGBLab对坐标偏移不一致或瓦块重名的多个OSGB工程的融合

OSGBLab的博客 3232

在MDK5.37版本中添加Complier Version 5( 解决Missing Compiler Version 5 )

本文章仅作为个人学习记录,方法也是从其他博主的博客中得到的,链接如下:二、Keil——Missing Compiler Version 5 和 core_cm3.c 问题解决 - YI颗白菜 - 博客园 (cnblogs.com) 问题描述 更新最新的keil版本(MDK5.37)后,在编译以前版本的工程文件时,发现出现了非常多的报错,在网上搜索之后发现原来时编译器版本不匹配的问题,即MDK5.37中使用的是Version 6版本的编译器,而缺少Version 5,对于以前编写的工

leveling99的博客 1万+

LPDDR5 学习笔记02:上电初始化与下电时序

LPDDR5上电初始化流程需严格遵守时序要求:首先确保电源按顺序上电(VDD1→VDD2H→VDD2L→VDDQ),RESET_n保持低电平至电压稳定。初始化包含自动ZQ校准、命令总线训练(CBT)、WCK2CK电平校准和DQ总线训练四个关键阶段,需完成全部训练后才能正常操作。在双电源轨系统中,须在CBT前设置MR13寄存器。复位操作需保持RESET_n低电平至少tPW_RESET时间,断电时要求CS保持低电平且电源电压有序下降。非受控下电时电压斜率需低于0.5V/μs,器件生命周期内不得超过400次非受控

一只豌豆象的博客 2042

【系统架构设计师-2026上半年真题】案例分析-参考答案及详解(回忆版)

架构评估与设计:通过入侵检测系统的案例分析,阐述质量属性(性能/可用性/安全性/可修改性)的匹配方法,推荐管道-过滤器风格处理实时数据流,并设计8个核心构件实现数据采集到告警的全流程处理。 高并发优化方案: 分析悲观锁(排他锁/共享锁)与乐观锁的特性差异,提出乐观锁通过版本号/CAS实现,悲观锁适用于强一致性场景。 给出Redis优化三手段:分布式锁控制临界资源、Lua脚本保证原子操作、热点数据多级缓存,结合消息队列削峰填谷。 分层架构实践: 智

数据知道的博客 1681

【原理图PCB专题】Cadence17.4 PCB位号重排与反标

Cadence17.4 PCB位号重排与反标比Cadence16版本更简单一些,那到底如何操作?

一点硬件 1181

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 【scala原理系列】scala Predef对象的原理示例源码详解
下一篇: 【Java原理系列】 scala JavaConverters原理用法示例源码详解
BigDataMLApplication
博客等级 码龄11年 7363粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

BigDataMLApplication

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

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

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

打赏作者

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

抵扣说明:

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

余额充值