SparkSQL 初体验_命令式案例 | 学习笔记

简介: 快速学习 SparkSQL 初体验_命令式案例

开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段SparkSQL 初体验_命令式案例】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/690/detail/12036


SparkSQL 初体验_命令式案例

 

命令式案例

接下来进行 spark SQL 的初体验。在初体验部分,要先明确 spark SQL 怎么去用。

大致分为两种用法,第一种,使用其命令式的 API,来进行相应的代码编写,第二个部分,使用声明式的这个 API,进行接口的编写。我们在命令式的 API 部分,要和 RDD做一个简单的对比,先去写一个 RDD 案例,RDD 案例完成以后,去编写一个 spark SQL 的案例。

两个案例一起说,这样会更容易去对比出来 RDD 区别,接下来进入到笔记当中,这两个案例,编写起来比较的简单,这部分我们就简单去说一个 wordcount 怎么写。

1、RDD 案例:

val config = new SparkConf ( ) .setAppName( "ip_ana" ) . setMaster ( "local[6]")

val sc = new SparkContext( config)

sc.textFile("hdfs ://node01:8020/dataset/wordcount.txt").

flatMap(_.split(”“))

map ( (_, 1))

reduceByKey ( : )

collect

进入到 IDEA 中,先打开 pom 文件,在 pom 文件中复制一下 spark core 一个加包的声明,然后拷贝出来一个新的,先把 spark 包导过来,把 core 改成 sql ,等待它缓慢的编译或读取,直接在 spark 的包下创建一个 sql,在 sql 中创建一个新的文件,命名为叫做 Intro ,就是入门的一个意思。

接下来,我们一同编写两个测试方法,第一个测试方法,叫做 RDD Intro,第二个就叫做 spark SQL 命令式 API Intro,然后 def ds Intro,我们这个两个测试方法创建好了,以后再去编写 RDD,首先第一步创建出来,第二步对数据进行处理,第三步获取则直接进行,首先,我们去创建一个 conf 对象出来。

大家注意到缺点这个 API,要去创建一个 conf有点繁琐,接下来,我们设置两个参数,第一个,叫做 master,这个 master 函数当中,我们传入 locate 在本地运行。

@Test

def rddIntro(): unit = {

Valconf=newSparkconf().setwaster("local[6]").setAppName("rdd intro")

val sc = new sparkcontext(conf)

sc.textFile(path="dataset/wordcount.txt")

.flatMap( _.split( regex =”"))

.map( (_, 1) )

.reduceByKey( _ + _)

.collect()_

.foreach( println(_ )  )

}

刚才是针对于每一条具体的数据来进行操作,对于 RDD 不知道这是什么,无论是什么,直接把这个对象去处理,处理好再给他,他把这个整个结果集生成出来,这个过程跟 SQL 有很大的区别。

2、spark SQL 案例

首先把入口 spark context 换成 spark session

@Test

def dsIntro(): unit = {

val spark = new sparksession.Builder()

.appName( name = "ds intro" )

.master( master = "local[6]")

.getorcreate()

import spark.implicits._

valsourceRDD=spark.sparkContext.parallelize(seq(Person("zhangsan",10),Person("lisi",15)

val personDs = sourceRDD.toDs()

val resultDs = personDs.where(condition = 'age > 10 ).where(condition = 'age < 20 )

.select(cols ='name )

.as[string]

resultDs.show()

}

我们来运行一下,这个时候,我们在运行的时候出现了一个错误,这个错误,其实特别经常见到,我们去读一读这个错误,unable to generate an encoder for inner classI,前面没看懂没关系,后面什么叫做 session,他没有办法处理这个内部,你要去剪切这个 plus,剪切到你整个代码的最外面,所以,大家在进行自己编写的时候,要特别注意这一点,我们再去运行一遍。

3、RDD 与 spark SQL 的区别

这时能看到我们的结果已经打印出来了,我们刚才创建了两个对象,一个叫做张三十岁,一个叫做李四15岁,我们查询十到20之间的用户,然后,打印出来的一个例子,这些叫做内容,这一点和我们 RDD 打印出来的内容就有一个非常大的区别,我们和 RDD 之间最大的区别就是,它的结构信息,有他这一列的列名,并且,我们也知道这一切是一个 string,Sparks SQL 它在进行操作的时候,是会有结构信息存在。

我们这种操作方式里面,是可以直接拿到这个 person 对象当中的某一列来进行操作。

直接按照一个对象当中的某一列来进行查询。这是和 RDD 最大的区别,除了这种方式以外,也有其他方式,比如说我直接拿到一个item来进行相应的这个转换操作,也可以的,这是我们的这一部分的内容。

4、SparkSession

SparkContext 作为 RDD 的创建者和入口,其主要作用有如下两点:

·创建 RDD,主要是通过读取文件创建 RDD

·监控和调度任务,包含了一系列组件,例如 DAGScheduler, TaskSheduler

为什么无法使用SparkContext作为SparksQL 的入口?

.SparkContext 在读取文件的时候,是不包含Schema信息的,因为读取出来的是  RDD。

SparkContext 在整合数据源如 Cassandra,SsON, Parquet 等的时候是不灵活的,而DataFrame 和 Dataset 一开始的设计目标就是要支持更多的数据源

. SparkContext 的调度方式是直接调度 RDD,但是一般情况下针对结构化数据的访问,会先通过优化器优化一下

所以 SparkContext 确实已经不适合作为 SparkSQL 的入口,所以刚开始的时候 Spark 团队为 SparkSQL 设计了两个入口点

一个是 SQLContext 对应 Spark 标准的 SQL 执行,另外一个是 HiveContext 对应 HiveSQL 的执行和 Hive 的支持。

在 Spark 2.0的时候,为了解决入口点不统一的问题,创建了一个新的入口点 SparkSession,作为整个 Spark 生态工具的统一入口点,包括了 SQLContext, HiveContext,SparkContext 等组件的功能

新的入口应该有什么特性?

能够整合 sQLContext , HiveContext ,SparkContext ,

StreamingContext 等不同的入口点·为了支持更多的数据源,应该完善读取和写入体系

·同时对于原来的入口点也不能放弃,要向下兼容。

相关文章
|
分布式计算 Hadoop 大数据
Spark 原理_总结介绍_案例编写 | 学习笔记
快速学习 Spark 原理_总结介绍_案例编写
98 0
Spark 原理_总结介绍_案例编写 | 学习笔记
|
分布式计算 数据挖掘 大数据
Spark 入门_代码编写方式|学习笔记
快速学习 Spark 入门_代码编写方式
76 0
Spark 入门_代码编写方式|学习笔记
|
分布式计算 大数据 数据处理
Sparkstreaming 案例-代码编写 | 学习笔记
快速学习 Sparkstreaming 案例-代码编写
65 0
Sparkstreaming 案例-代码编写 | 学习笔记
|
分布式计算 大数据 Spark
Spark 入门_独立应用编写|学习笔记
快速学习 Spark 入门_独立应用编写
93 0
Spark 入门_独立应用编写|学习笔记
|
SQL 分布式计算 大数据
Structured_案例_代码编写 | 学习笔记
快速学习 Structured_案例_代码编写
80 0
Structured_案例_代码编写 | 学习笔记
|
SQL Web App开发 流计算
Flink入坑指南第五章 - 语法糖 view
Flink入坑指南系列文章,从实际例子入手,一步步引导用户零基础入门实时计算/Flink,并成长为使用Flink的高阶用户。本文属个人原创,仅做技术交流之用,笔者才疏学浅,如有错误,欢迎指正。 什么是view(视图):视图无非就是存储在数据库中并具有名字的 SQL 语句,或者说是以预定义的 SQL 查询的形式存在的数据表的成分。
3631 0