SparkSQL入门

1、SparkSQL是什么?

结论:SparkSQL 是一个即支持 SQL 又支持命令式数据处理的工具

2、SparkSQL 的适用场景?

结论:SparkSQL 适用于处理结构化数据的场景,而Spark 的 RDD 主要用于处理 非结构化数据 和 半结构化数据

2.1  结构化、非结构化、半结构化数据的区别

(1)结构化数据:一般指数据有固定的 Schema(数据具体的结构信息, 例如在用户表中, name 字段是 String 型, 那么每一条数据的 name 字段值都可以当作 String 来使用

(2)半结构化数据:一般指的是数据没有固定的 Schema, 但是数据本身是有结构的

解释:

没有固定Schema:指的是半结构化数据是没有固定的 Schema 的, 可以理解为没有显式指定 Schema。

举例:比如说一个用户信息的 JSON 文件, 第一条数据的 phone_num 有可能是 String, 第二条数据虽说应该也是 String, 但是如果硬要指定为 BigInt, 也是有可能的
因为没有指定 Schema, 没有显式的强制的约束

有结构:虽说半结构化数据是没有显式指定 Schema 的, 也没有约束, 但是半结构化数据本身是有有隐式的结构的, 也就是数据自身可以描述自身。

举例:
例如 JSON 文件, 其中的某一条数据是有字段这个概念的, 每个字段也有类型的概念, 所以说 JSON 是可以描述自身的, 也就是数据本身携带有元信息

{"firstName": "John","lastName": "Smith","age": 25,"phoneNumber":[{"type": "home","number": "212 555-1234"},{"type": "fax","number": "646 555-4567"}]}

总结:



           

3、程序入口SparkSession

SparkSession 

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

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

  • 监控和调度任务, 包含了一系列组件, 例如 DAGSchedulerTaskSheduler

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

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

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

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

        所以 SparkContext 确实已经不适合作为 SparkSQL 的入口, 所以刚开始的时候 Spark 团队为 SparkSQL 设计了两个入口点, 一个是 SQLContext 对应 Spark 标准的 SQL 执行, 另外一个是 HiveContext 对应 HiveSQL 的执行和 Hive 的支持.

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

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

  • 能够整合 SQLContextHiveContextSparkContextStreamingContext 等不同的入口点

  • 为了支持更多的数据源, 应该完善读取和写入体系

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

4、DataFrame

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表 格,除了数据以外,还掌握数据的结构信息,即schema。一般情况下要先通过 DataFrame 或者 Dataset 注册一张临时表, 然后使用 SQL 操作这张临时表。

 SparkSQL 对外提供的 API 有两类, 一类是直接执行 SQL, 另外一类就是命令式. SparkSQL 提供的命令式 API 就是DataFrame DSL(Domain Specific Language)API(也称为 Dataset API), 暂时也可以认为 DataFrame 就是 Dataset, 只是在不同的 API 中返回的是 Dataset 的不同表现形式。

版本演变:

  • DataFrame:在Spark 1.3及之后的版本中引入,是一个分布式的数据集合。它可以被看作是一个表格型的数据结构,包含了一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值等)。DataFrame既有行索引也有列索引,可以看作是由Series组成的字典(共同使用一个索引)。
  • Dataset:在Spark 1.6及之后的版本中引入,是DataFrame的扩展。Dataset是一个强类型、不可变的分布式数据集合,它提供了编译时类型安全检查。Dataset是Spark SQL中一个新的分布式数据集合抽象,提供了RDD的优势(强类型、使用强大的lambda函数的能力)以及Spark SQL优化执行引擎的优点。
  • 在Spark 2.0及之后的版本中,DataFrame和Dataset的API已经统一,DataFrame被看作是Dataset[Row]的一个特例,即具有schema的分布式Row对象的集合。

5、入门程序案例(直接执行 SQL方式)

       统计班级人数

import org.apache.spark.sql.{DataFrame, Dataset, Row, SaveMode, SparkSession}object Demo1WorldCount {def main(args: Array[String]): Unit = {/*** 在新版本的Scala中,如果想要编写spark sql,需要使用新的spqrk入口类:Sparksession**/val sparkSession: SparkSession = SparkSession.builder().master("local").appName("wc spark sql").getOrCreate()/*** spark sql和spark core的核心数据类型不一样* 1、读取数据构建一个DataFrame,相当于一张表*///1500100954,咸芷天,21,女,文科二班val studentsDF: DataFrame = sparkSession.read.format("csv") //指定读取文件的格式.schema("id String,name String,age String,gender String,clazz String") //指定列的名称及类型,多个列之间用逗号分割.option("sep", ",") //指定分割符,csv格式读取默认是英文逗号.load("spark/data/student.csv") //指定读取文件98的位置,可以使用相对路径//    studentsDF.show() //查看DF中的数据内容(表内容)//    studentsDF.printSchema()   //查看studentsDF表结构/*** DF本身是无法直接写sql的,需要将DF注册为一个视图,才可以写sql语句*/studentsDF.createOrReplaceTempView("students") //起一个表名,给后面的sql语句使用/*** 3、可以编写sql语句(统计班级人数)* 注意:spark完全兼容hive sql*/
//    val resDF: DataFrame = sparkSession.sql("select * from students")  //如果语句短,可以写在一行,使用""即可val resDF: DataFrame = sparkSession.sql("""|select|clazz,|count(1) as clazz_number|from students|group by clazz|""".stripMargin)              //当语句过长可以使用""""""三引号/*** 4、将计算的结果DF保存到hdfs中*/val resDS: Dataset[Row] = resDF.repartition(1)   //设置分区数resDS.write.format("csv") //指定输出文件的格式.option("sep",",")   //指定分隔符.mode(SaveMode.Append)    //使用SaveMode枚举类,设置为覆盖写.save("hdfs://master:9000/bigdata29/spark/clazz_number")    //指定hdfs输出的文件路径}
}

    
参考原文链接:https://blog.csdn.net/qq_26442553/article/details/114970346

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

掌握ASPICE标准:汽车软件测试工程师的专业发展路径

掌握ASPICE标准:汽车软件测试工程师的专业发展路径 文:领测老贺 随着新能源汽车在中国的蓬勃发展,智能驾驶技术的兴起,汽车测试工程师的角色变得愈发关键。这一变革带来了前所未有的挑战和机遇,要求测试工程师不仅要具…

解决git克隆项目出现fatal无法访问git clone https://github.com/lvgl/lvgl.git

Windows 11系统 报错 $ git clone https://github.com/lvgl/lvgl.git Cloning into lvgl... fatal: unable to access https://github.com/lvgl/lvgl.git/: Failed to connect to github.com port 443 after 21141 ms: Couldnt connect to server 解决方法 git运行这两段代码…

创新实训2024.05.26日志:落地基于硬盘的数据库服务

1. 需求任务列表 以下描述易学大模型软件的web应用的功能。 用户注册 用户邮箱,密码,验证码开启官方邮箱,用来发验证码(QQ 网易都支持开启smtp协议,找教程,用邮箱不用手机号是为了省买发短信云服务的钱&a…

ASP+ACCESS客户管理信息系统

摘要 本文介绍了客户管理系统的实现方法。目的在于让大家共享学习和运用这一语言的体会和收获。本系统是Internet/Intranet环境下面向电子商务的客户管理,通过企业管理技术、电子商务和信息技术的高度集成,讨论了客户管理系统的系统构架、系统的工作…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构: 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈:栈的插入操作叫做进栈/压栈…

python 面对对象 类 魔法方法

魔法方法 一、__init__ 构造函数,可以理解为初始化 触发条件:在实例化的时候就会触发 class People():def __init__(self, name):print(init被执行)self.name namedef eat(self):print(f{self.name}要吃饭)a People(张三) a.eat() # in…

海外抖音TK自动挂机,手机全自动挂机,每天轻松搞2张

海外抖音TK自动挂机,手机全自动挂机,每天轻松搞2张 课程获取方式: https://zzmbk.com/

揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!

文章目录 前言1.标题1.1 使用 和 - 标记一级和二级标题1.2 使用 # 号标记 2.段落格式2.1 字体2.2 分割线2.3 删除线2.4 下划线2.5 脚注 3.列表3.1 无序列表3.2 有序列表3.3 列表嵌套 4.区块4.1 区块中使用列表4.2 列表中使用区块 5.代码代码区块 6.链接7.图片8.表格9.高级技巧…

mysql实战——XtraBackup二进制包安装

1、二进制包下载网站 Software Downloads - Percona 2、安装xtrabackup 解压安装包 tar xvf percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17.tar.gz -C /usr/local 进入目录 cd percona-xtrabackup-8.0.27-19-Linux-x86_64.glibc2.17/ 安装依赖 yum install perl-Dig…

2024.5.25期末测试总结

成绩&#xff1a; 配置&#xff1a; 可能与实际有些出入 题目&#xff1a; 第一题&#xff1a; 代码思路&#xff1a; 一道模拟题&#xff0c;按照公式计算出sumpow(2,i)&#xff0c;判断sum>H&#xff0c;输出 代码&#xff1a; #include<bits/stdc.h> using name…

Java—内部类

Java—内部类 一、内部类二、应用特点三、分类3.1、普通内部类&#xff1a;直接将一个类的定义放在另外一个类的类体中3.2、静态内部类3.3、局部内部类 一、内部类 一个类的定义出现在另外一个类&#xff0c;那么这个出现的类就叫内部类(Inner)。 内部类所在的类叫做外部类(Ou…

在线软件包管理

1.APT工作原理 APT&#xff08;Advanced Packaging Tool&#xff09;是Debian系列Linux操作系统中广泛使用的包管理工具&#xff0c;它为用户提供了从软件仓库搜索、安装、升级和卸载软件包的功能。其工作原理具体分析如下&#xff1a; 1. **集中式软件仓库机制**&#xff1a…

Linux之Nginx

1、Nginx 1.1、什么是Nginx Nginx最初由Igor Sysoev开发&#xff0c;最早在2004年公开发布。它被设计为一个轻量级、高性能的服务器&#xff0c;能够处理大量并发连接而不消耗过多的系统资源。Nginx的架构采用了事件驱动的方式&#xff0c;能够高效地处理请求。它的模块化设计使…

python-情报加密副本

【问题描述】某情报机构采用公用电话传递数据&#xff0c;数据是5位的整数&#xff0c;在传递过程中是加密的。加密规则如下&#xff1a;每位数字都加上8,然后用和除以7的余数代替该数字&#xff0c;再将第1位和第5位交换&#xff0c;第2位和第4位交换。请编写程序&#xff0c;…

Denoising Diffusion Probabilistic Models 全过程概述 + 论文总结

标题&#xff1a;Denoising&#xff08;&#x1f31f;去噪&#xff09;Diffusion Probabilistic Models&#xff08;扩散概率模型&#xff09; 论文&#xff08;NeurIPS会议 CCF A 类&#xff09;&#xff1a;Denoising Diffusion Probabilistic Models 源码&#xff1a;hojona…

卡特兰数-

是组合数学中一种常出现于各种计数问题中的数列。 一、简单介绍 卡特兰数是一个数列&#xff0c;其前几项为&#xff08;从第零项开始&#xff09; : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 47763…

澳大利亚.德国-新闻媒体投放通稿:发表新闻稿需要留意哪些地方-大舍传媒

概述 当我们想要发布新闻稿时&#xff0c;了解目标媒体的特点和要求是至关重要的。本文将介绍澳大利亚和德国的新闻媒体&#xff0c;以及在撰写和投放新闻稿时需要注意的要点&#xff0c;以帮助您更好地与目标受众沟通。 澳大利亚媒体 澳大利亚是一个多元化的国家&#xff0…

Android ListView鼠标模式下ListView回滚问题

概述 在 Android 应用程序中&#xff0c;ListView 是一种常用的控件&#xff0c;用于显示可滚动列表数据。然而&#xff0c;当在鼠标操作模式下使用 ListView 时&#xff0c;可能会遇到一个问题&#xff1a;点击列表项时&#xff0c;列表会回滚到指定位置&#xff0c;这可能会导…

【ML Olympiad】预测地震破坏——根据建筑物位置和施工情况预测地震对建筑物造成的破坏程度

文章目录 Overview 概述Goal 目标Evaluation 评估标准 Dataset Description 数据集说明Dataset Source 数据集来源Dataset Fields 数据集字段 Data Analysis and Visualization 数据分析与可视化Correlation 相关性Hierarchial Clustering 分层聚类Adversarial Validation 对抗…

OFDM通信中的部分内容

纠错编码&#xff1a;在无线通信过程中由于传输过程存在噪声等各种非理想因素&#xff0c;在接收端接收到的信息往往相对于发射信息存在误码&#xff0c;通过纠错编码方式可以对少数非连续的误码进行判断和纠正。举个简单的例子&#xff0c;发射端可能发射的信息为00,01,10,11,…