Spark session 深入理解


参考自:https://www.cnblogs.com/zzhangyuhang/p/9039695.html

Spark session 深入理解

在Spark1.6中我们使用的叫Hive on spark,主要是依赖hive生成spark程序,有两个核心组件SQLcontext和HiveContext。
这是Spark 1.x 版本的语法

//set up the spark configuration and create contexts
 
val sparkConf = new SparkConf().setAppName("SparkSessionZipsExample").setMaster("local")
// your handle to SparkContext to access other context like SQLContext
val sc = new SparkContext(sparkConf).set("spark.some.config.option", "some-value")
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

而Spark2.0中我们使用的就是sparkSQL,是后继的全新产品,解除了对Hive的依赖。

从Spark2.0以上的版本开始,spark是使用全新的SparkSession接口代替Spark1.6中的SQLcontext和HiveContext
来实现对数据的加载、转换、处理等工作,并且实现了SQLcontext和HiveContext的所有功能。
我们在新版本中并不需要之前那么繁琐的创建很多对象,只需要创建一个SparkSession对象即可。
SparkSession支持从不同的数据源加载数据,并把数据转换成DataFrame,并支持把DataFrame转换成SQLContext自身中的表。
然后使用SQL语句来操作数据,也提供了HiveQL以及其他依赖于Hive的功能支持。

创建SparkSession

SparkSession 是 Spark SQL 的入口。
使用 Dataset 或者 Datafram 编写 Spark SQL 应用的时候,第一个要创建的对象就是 SparkSession。
Builder 是 SparkSession 的构造器。 通过 Builder, 可以添加各种配置。

Builder 的方法如下:

MethodDescriptiongetOrCreate获取或者新建一个 sparkSessionenableHiveSupport增加支持 hive SupportappName设置 application 的名字config设置各种配置
你可以通过 SparkSession.builder 来创建一个 SparkSession 的实例,并通过 stop 函数来停止 SparkSession。

import
org.apache.spark.sql.SparkSession
val spark: SparkSession=SparkSession.builder
    .appName("My Spark Application")
    .master("local[*]")              // 如果打包到集群中  master("local[2]")  注释掉
    .enableHiveSupport()             // 使sparkSesssion支持hive
    .getOrCreate()

这样我就就可以使用我们创建的SparkSession类型的spark对象了。

设置参数

创建SparkSession之后可以通过 spark.conf.set 来设置运行参数

//set new runtime options
 
spark.conf.set("spark.sql.shuffle.partitions", 6)
 
spark.conf.set("spark.executor.memory", "2g")
 
//get all settings
 
val configMap:Map[String, String] = spark.conf.getAll()
//可以使用Scala的迭代器来读取configMap中的数据。

读取元数据

如果需要读取元数据(catalog),可以通过SparkSession来获取。

//fetch metadata data from the catalog
 
spark.catalog.listDatabases.show(false)
 
spark.catalog.listTables.show(false)

这里返回的都是Dataset,所以可以根据需要再使用Dataset API来读取。
在这里插入图片描述

注意:catalog 和 schema 是两个不同的概念
Catalog是目录的意思,从数据库方向说,相当于就是所有数据库的集合;
Schema是模式的意思, 从数据库方向说, 类似Catelog下的某一个数据库;
创建Dataset和Dataframe
通过SparkSession来创建Dataset和Dataframe有多种方法。
最简单的就是通过range()方法来创建dataset,通过createDataFrame()来创建dataframe。

//create a Dataset using spark.range starting from 5 to 100, with increments of 5
val numDS = spark.range(5, 100, 5)
//创建dataset
// reverse the order and display first 5 items
numDS.orderBy(desc("id")).show(5)
//compute descriptive stats and display them
numDs.describe().show()
// create a DataFrame using spark.createDataFrame from a List or Seq
val langPercentDF = spark.createDataFrame(List(("Scala", 35), ("Python", 30), ("R", 15), ("Java", 20)))
//创建dataframe
//rename the columns
val lpDF = langPercentDF.withColumnRenamed("_1", "language").withColumnRenamed("_2", "percent")
//order the DataFrame in descending order of percentage
lpDF.orderBy(desc("percent")).show(false)

在这里插入图片描述

读取数据

可以用SparkSession读取JSON、CSV、TXT和parquet表。

import spark.implicits 
//使RDD转化为DataFrame以及后续SQL操作
//读取JSON文件,生成DataFrame
val jsonFile = args(0)
val zipsDF = spark.read.json(jsonFile)

使用SparkSQL

借助SparkSession用户可以像SQLContext一样使用Spark SQL的全部功能。

zipsDF.createOrReplaceTempView("zips_table")
//对上面的dataframe创建一个表
zipsDF.cache()
//缓存表
val resultsDF = spark.sql("SELECT city, pop, state, zip FROM zips_table")
//对表调用SQL语句
resultsDF.show(10)
//展示结果

存储/读取Hive表

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

//drop the table if exists to get around existing table error
 
spark.sql("DROP TABLE IF EXISTS zips_hive_table")

下图是 SparkSession 的类和方法

这些方法包含了创建 DataSet

方法说明
builder创建一个sparkSession实例
version返回当前spark的版本
implicits引入隐式转化
emptyDataset[T]创建一个空DataSet
range创建一个DataSet[Long]
sql执行sql查询(返回一个dataFrame)
udf自定义udf(自定义函数)
table从表中创建DataFrame
catalog访问结构化查询实体的目录
read外部文件和存储系统读取DataFrame。
conf当前运行的configuration
readStream访问DataStreamReader以读取流数据集。
streams访问StreamingQueryManager以管理结构化流式传输查询。
newSession创建新的SparkSession
stop停止SparkSession
write访问DataStreamReader以写入流数据集。

当我们使用Spark-Shell的时候,Spark会自动帮助我们建立好了一个名字为spark的SparkSesson和一个名字为sc的SparkContext。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值