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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇

1. 前言 线程池这块,作为高频面试题,并且实际使用场景巨多,所以出了这篇文章,一块来研究一下线程池的实现原理,运行机制,从底层深挖,不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…

Leecode热题100---55:跳跃游戏(贪心算法)

题目: 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 贪心算…

数据采集与AI分析,亮数据+通义千问助力跨境电商前行

文章目录 前言工具介绍数据采集工具亮数据Web Scraper IDE亮点 AI数据分析工具 实战电商数据采集与AI分析电商平台选取数据采集完全托管数据集自定义数据集 AI分析 价格总结 前言 随着信息技术的飞速发展,数据采集与AI分析在跨境电商中扮演着越来越重要的角色。通过…

Langchain:数据连接封装、缓存封装和LCEL学习和探索

🌵 目录 🌵 😋 数据连接封装 🍔 文档加载器:Document Loaders 文档处理器:TextSplitter 向量数据库与向量检索 总结 🍉 缓存封装:Memory 🏖️ 对话上下文&#xf…

urllib_post请求_百度翻译

打开百度翻译,并打开控制台,输入spider,然后在网络中找到对应的接口,可以看出,该url是post请求 在此案例中找到的接口为sug,依据为: 可以看到,传递的数据为kw : XXX, 所…

Hadoop3:HDFS的Fsimage和Edits文件介绍

一、概念 Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。 Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先 会被记录到Ed…

移动云ECS主机:未来云计算的驱动力

文章目录 前言一、移动云云主机ECS云主机ECS产品优势云主机ECS产品功能云主机ECS应用场景 二、移动云云主机ECS选购三、移动云云主机ECS配置四、移动云云主机ECS牛刀小试五、移动云云主机ECS安装部署消息中间件RocketMQ云主机ECS安装RocketMQ云主机ECS配置RocketMQ云主机ECS启动…

如何做好云安全防护

随着云计算技术的迅猛发展和普及,越来越多的企业和个人选择将数据和业务应用迁移到云平台,以享受其带来的高效、便捷和可扩展性。然而,云环境的复杂性和开放性也带来了前所未有的安全挑战。如何确保云环境中的数据安全,成为了每一…

【Linux】lsblk 命令使用

lsblk 命令 lsblk 是一个在 Linux 系统中用来列出所有可用的块设备(例如硬盘驱动器、固态硬盘、USB 驱动器等)的命令行工具。它提供了关于这些设备的详细信息,包括它们的名称、大小、类型、挂载点等。 语法 lsblk [选项] 选项及作用 执行…

LabVIEW高温往复摩擦测试系统中PID控制

在LabVIEW开发高温往复摩擦测试系统中实现PID控制,需要注意以下几个方面: 1. 系统建模与参数确定 物理模型建立: 首先,需要了解被控对象的物理特性,包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…

PVE 虚拟机环境下删除 local-lvm分区

1、删除逻辑卷 lvremote pve/data 2、扩展逻辑卷 lvextend -l 100%FREE -r pve/root 3、 修改存储目录内容 点击 Datacenter - Storage (1)删除local-lvm分区 (2)编辑local分区,在内容一项中勾选所有可选项。

黑龙江等保测评深入理解

“没有网络安全,就没有国家安全”,等级保护测评是指按照网络安全系统制定的一系列的防护过程,对已经有的和即将上线的商业服务的基础设施(系统,数据库,中间件等)所做的一系列的检查,…

Thinkphp3.2.3网站后台不能访问如何修复

我是使用Thinkphp3.2.3新搭建的PHP网站,但是网站前台可以访问,后台访问出现如图错误: 由于我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板,对于上述出现的问题不清楚如何处理,因此联系Hostease的…

第3天 Web源码拓展_小迪网络安全笔记

1.关于web源码目录结构 #数据库配置文件 后台目录 模板目录 数据库目录 1.1数据库配置文件: 1.1就拿wordpress来说,先到官网下载源码:Download – WordPress.org,解压源码之后: 2.2找到目录下名为 wp-config-sample.php的文件,这就是数据库配置文件: 设想: 我们在渗透…

如何将word插入的形状转成图片(高清)导出?

文章目录 前言(不感兴趣可以直接看正文)一、新建画布二、插入形状三、复制四、粘贴为图片五、另存为总结 前言(不感兴趣可以直接看正文) 因为我毕业论文里的图片刚开始使用画图软件画的,但到后期论文即将胶印的时候&a…

Agent将如何影响和重塑企业服务市场?

在Sam Altman、吴恩达等几位AI业界人士的“带货”之下,Agent作为新一代生产力工具的巨大潜力和广泛的应用前景终于“破圈”、被更多的看到和讨论。其实在2023年时,我就预测过,2024年会是大语言模型应用落地和Agent的元年。 为什么Agent会是大…

从零到一:手把手教你将项目部署上线-环境准备

部署步骤 引言1.Java环境配置2.ngnix安装好书推荐 引言 将自己的项目从本地开发环境顺利部署上线,是每个开发者必经的里程碑。今天,我们就从零开始,一步一步教你如何将手中的项目部署到线上,让全世界见证你的创造力。 首先&#x…

第十八篇:探索非关系型数据库:从入门到实践

探索非关系型数据库:从入门到实践 1. 引言 1.1 非关系型数据库的崛起:背景与重要性 在过去的几十年里,关系型数据库(RDBMS)一直在数据存储和管理领域占据主导地位。其严谨的结构化数据模型以及强大的事务处理能力&am…

只需提交几次代码就能轻松实现系统级的变更!——“基础设施即代码”模式与实践

“基础设施即代码”模式与实践 基础设施即代码(Infrastructure as Code,IaC)是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC,我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行…