【SparkSQL】基础入门(重点:SparkSQL和Hive的异同、SparkSQL数据抽象)

news2025/1/22 8:51:51

【大家好,我是爱干饭的猿,本文重点介绍Spark SQL的定义、特点、发展历史、与hive的区别、数据抽象、SparkSession对象。

后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】

上一篇文章:《【Spark入门】基础入门》

1. SparkSQL

1.1 什么是SparkSQL

SparkSQL 是Spark的一个模块, 用于处理海量结构化数据
限定: 结构化数据处理

1.2 为什么要学习SparkSQL

SparkSQL是非常成熟的 海量结构化数据处理框架

学习SparkSQL主要在2个点:

  • SparkSQL本身十分优秀, 支持SQL语言\性能强\可以自动优化\API简单\兼容HIVE等等
  • 企业大面积在使用SparkSQL处理业务数据
    • 离线开发
    • 数仓搭建
    • 科学计算
    • 数据分析

1.3 SparkSQL特点

1. 融合性

SQL可以无缝集成在代码中,随时用sQL处理数据

2. 统一数据访问

一套标准API可读写不同数据源

3. Hive兼容

可以使用SparkSQL直接计算并生成Hive数据表

4. 标准化连接

支持标准化JDBC\ODBC连接,方便和各种数据库进行数据交互

1.4 SparkSQL发展历史

在许多年前(2012\2013左右)Hive逐步火热起来, 大片抢占分布式SQL计算市场。

Spark作为通用计算框架, 也不可能放弃这一细分领域,于是, Spark官方模仿Hive推出了Shark框架(Spark 0.9版本) Shark框架是几乎100%模仿Hive, 内部的配置项\优化项等都是直接模仿而来。不同的在于将执行引擎由MapReduce更换为了Spark。

因为Shark框架太模仿Hive, Hive是针对MR优化, 很多地方和SparkCore(RDD)水土不服, 最终被放弃,Spark官方下决心开发一个自己的分布式SQL引擎 也就是诞生了现在的SparkSQL。

在这里插入图片描述
● 2014年 1.0正式发布
● 2015年 1.3 发布DataFrame数据结构, 沿用至今
● 2016年 1.6 发布Dataset数据结构(带泛型的DataFrame), 适用于支持泛型的语言(Java\Scala)
● 2016年 2.0 统一了Dataset 和 DataFrame, 以后只有Dataset了, Python用的DataFrame就是 没有泛型的Dataset
● 2019年 3.0 发布, 性能大幅度提升,SparkSQL变化不大

2. SparkSQL 概述

2.1 SparkSQL和Hive的异同在这里插入图片描述

Hive和Spark均是:“分布式SQL计算引擎”

均是构建大规模结构化数据计算的绝佳利器,同时SparkSQL拥有更好的性能。

目前,企业中使用Hive仍旧居多,但SparkSQL将会在很近的未来替代Hive成为分布式SQL计算市场的顶级

2.2 SparkSQL的数据抽象

在这里插入图片描述
在这里插入图片描述

2.3 SparkSQL数据抽象的发展

从SparkSQL的发展历史可以看到:
• 14年最早的数据抽象是:SchemaRDD(内部存储二维表数据结构的RDD),SchemaRDD就是魔改的RDD,将RDD支持的存储数据,限定
为二维表数据结构用以支持SQL查询。由于是魔改RDD,只是一个过渡产品,现已废弃。
• 15年发布DataFrame对象,基于Pandas的DataFrame(模仿)独立于RDD进行实现,将数据以二维表结构进行存储并支持分布式运行
• 16年发布DataSet对象,在DataFrame之上添加了泛型的支持,用以更好的支持Java和Scala这两个支持泛型的编程语言
• 16年,Spark2.0版本,将DataFrame和DataSet进行合并。其底层均是DataSet对象,但在Python和R语言到用时,显示为DataFrame对象
。和老的DataFrame对象没有区别

2.4 DataFrame数据抽象

在这里插入图片描述
DataFrame和RDD都是:弹性的、分布式的、数据集
只是,DataFrame存储的数据结构“限定”为:二维表结构化数
据,而RDD可以存储的数据则没有任何限制,想处理什么就处理什么
在这里插入图片描述
所以DataFram更适合sql处理

2.5 SparkSession对象

在RDD阶段,程序的执行入口对象是: SparkContext
在Spark 2.0后,推出了SparkSession对象,作为Spark编码的统一入口对象。
SparkSession对象可以:

  • 用于SparkSQL编程作为入口对象
  • 用于SparkCore编程,可以通过SparkSession对象中获取到SparkContext
    所以,我们后续的代码,执行环境入口对象,统一变更为SparkSession对象

在这里插入图片描述
代码演示:

# coding:utf8

# SparkSession对象的导包,对象是来自于pyspark.sql包中
from pyspark.sql import SparkSession

if __name__ == '__main__':
    # 构建SparkSession执行环境入口对象
    spark = SparkSession.builder.\
        appName("test").\
        master("local[*]").\
        getOrCreate()

    # 通过SparkSession对象获取SparkContext对象
    sc = spark.sparkContext

    # SparkSOL的HelloWorld
    df = spark.read.csv("../xian_rent/rent.csv", sep=',', header=True)
    # 展示表结构
    df.printSchema()

    # 注册成零时表,可以通过sql使用
    df.createTempView("rent_data")

    # 1. SQL 风格
    spark.sql("""
        select * from rent_data where price >= 8000 limit 5
    """).show()

    # 2. DSL 风格
    df.where("price >= 8000").limit(5).show()

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

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

相关文章

Python三百行代码实现一简约个人博客网站(全网最小巧)

这是全互联网最小巧的博客,没有比这更小的了。虽然小巧,但功能一点儿也不弱,支持文章的分页展示,文章表格,图片和代码语法高亮。文章无限制分类,访问量统计,按时间和按点击量排序,展…

端口隔离度

端口隔离度 隔离度为(本振或射频信号)泄漏到其他端口的功率与输入功率之比,单位是dB。 比如 RF to LO Isolation 表示 射频输入信号的功率 与 泄漏到LO端口的功率 之比。 而 LO to RF Isolation 则表示 本振输入信号的功率 与 泄漏到RF端口的…

深入Python元编程:了解声明与初始化定制元类

更多资料获取 📚 个人网站:ipengtao.com 简介 在Python中,元编程是指在运行时创建或定制类的编程。元类是Python中最强大的元编程工具之一,允许您控制类的创建过程。元类是类的类,它控制类的实例化,允许您…

Xcode 来自身份不明的开发者且与之前打开的版本不同。你确定要打开它吗?

Xcode新建一个项目,模拟器运行的时候频繁跳出 “x x x”来自身份不明的开发者且与之前打开的版本不同。你确定要打开它吗? 如下图: 这个和在mac上安装应用的情况有点不一样,在mac上安装应用遇到这个问题,只需要在“设置”-->…

深入了解Spring Boot中@Async注解的8大坑点

文章目录 1. 缺少EnableAsync注解2. 异步方法需独立3. 不同的异步方法间无法相互调用4. 返回值为void的异步方法无法捕获异常5. 外部无法直接调用带有Async注解的方法6. Async方法不适用于private方法7. 缺失异步线程池配置8. 异步方法与事务的兼容结语 🎉深入了解S…

对于 ` HttpServletResponse ` , ` HttpServletRequest `我们真的学透彻了吗

对于 **HttpServletResponse , HttpServletRequest**我们真的学透彻了吗 问题引入 PostMapping("/importTemplate") public void importTemplate(HttpServletResponse response) {ExcelUtil<SysUser> util new ExcelUtil<SysUser>(SysUser.class);uti…

深入了解Java8新特性-日期时间API之TemporalQuery、TemporalQueries

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概2000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

网络安全 | 使用人工智能阻止网络攻击

全球范围内分布式拒绝服务 (DDoS) 网络攻击急剧增加&#xff0c;这种数字攻击可以通过大量的互联网流量压垮目标服务器&#xff0c;从而使网站瘫痪。这种攻击每年都会发生数百万起&#xff0c;而且数量和规模都在不断增加。大约三分之一的网站宕机是由于 DDoS 攻击所致。 计算…

UVA 108 Maximum Sum

UVA 108 Maximum Sum 题面翻译 给定一个含有正负数的二维数组&#xff0c;找出有最大和的子矩阵。矩阵的和指矩阵中所有元素的和。 一个子矩阵是任意在总矩阵中大小为1x1或更大的邻近子数组&#xff0c;例如在下面的矩阵中: 0 −2 −7 0 9 2 −6 2 −4 1 −4 1 −1 8 0 −…

C++学习寄录(八.继承)

继承的语法&#xff1a;class 子类 : 继承方式 父类 class A : public B; A 类称为子类 或 派生类 B 类称为父类 或 基类 1.基本使用 未使用继承的代码比较冗余重复 #include <iostream> #include <fstream> #include <string> #include <chrono>…

搞定这三个问题 伦敦金止损就没问题

笔者多次强调&#xff0c;做伦敦金交易&#xff0c;重要的是风险控制。而止损是我们风险控制中一个很重要的概念。设定好止损&#xff0c;就是风险控制的好开始。下面我们通过三个问题&#xff0c;来解决止损的问题。 问题一&#xff0c;你的止损位在哪里&#xff1f;要做止损&…

python -- python安装

1、python的诞生和发展&#xff1a; python语言是一种解释型、面向对象型、动态数据类型的高级程序设计语言。 2、python的安装&#xff1a; 1、安装解析器&#xff1a; 在安装的过程中需要注意的是&#xff1a; 在安装pycharm的时候也是同样的道理&#xff0c;需要指定安装…

解决:IDEA的debug模式只有第一次能拦截请求进行debug,后续所有请求全部失效

解决&#xff1a;IDEA的debug模式只有第一次能拦截请求进行debug&#xff0c;后续所有请求全部失效 一问题描述&#xff1a;IDEA的debug模式只有第一次能拦截请求进行debug&#xff0c;后续所有请求全部失效二问题原因&#xff1a;对IDEA的debug功能不熟悉或者理解有偏差三解决…

vs配置64位汇编

vs开发64位程序无法使用内联汇编&#xff0c;需要将汇编放到一个单独文件中编译链接。 步骤如下&#xff1a; 生成汇编代码。以asm.asm为例&#xff0c;以下是模板&#xff1a; ;64位汇编程序模板 (Template) ;声明一个ExitProcess函数 ExitProcess PROTO.data;在这里声明变量…

外汇天眼:外汇市场中的“双向交易”是什么意思?

说到外汇市场&#xff0c;总免不了提到它双向交易的优势&#xff0c;很多新手会对这一点有所疑问&#xff0c;今天我们就帮大家解决这一个疑问。 何谓双向交易&#xff1f; 金融市场上&#xff0c;交易者最常接触到的股票&#xff0c;多属于单向交易。 单向交易的模式便是「先…

如何快速生成项目目录结构树?

经常在网上看到下面这种由一个项目&#xff0c;生成一个结构树&#xff0c;你知道它是怎么生成的吗&#xff1f; 这就是利用本文要介绍的一个工具——Treer&#xff0c;treer就是一款专门用来快速生成目录结构树的命令行工具。 第一步&#xff1a;安装treer 在终端执行全局…

分布式机器学习、联邦学习、多智能体的区别和联系——一文进行详细解释

1 分布式机器学习、联邦学习、多智能体介绍 最近这三个方面的论文都读过&#xff0c;这里写一篇博客归纳一下&#xff0c;以方便搞这几个领域的其他童鞋入门。我们先来介绍以下这三种机器学习范式的基本概念。 1.1 分布式机器学习介绍 分布式机器学习(distributed machine l…

vivado综合分析与收敛技巧3

1、最优化 RAMB 输入逻辑以允许输出寄存器推断 以下 RTL 代码片段可从块 RAM &#xff08; 实际上为 ROM &#xff09; 生成关键路径 &#xff0c; 其中包含多个止于触发器 (FF) 的逻辑层次。 RAMB单元已在无可选输出寄存器 (DOA-0) 的情况下完成推断 &#xff0c; 这给 R…

美颜SDK是什么?美颜SDK对比测评

为了实现实时、高效的美颜效果&#xff0c;开发者们纷纷转向美颜SDK这一技术解决方案。那么&#xff0c;美颜SDK究竟是什么&#xff1f;本文将深入探讨美颜SDK的概念&#xff0c;并通过对比测评不同美颜SDK&#xff0c;为开发者和用户提供更清晰的选择参考。 一、美颜SDK的概念…

高效管理文件方法:根据文件大小智能移动至目标文件夹

在日常的工作中&#xff0c;会遇到大量的文件&#xff0c;从几个KB的小文档到几个GB的大数据文件。如何有效地管理这些文件&#xff0c;以便能够快速找到所需的资料&#xff0c;是一项重要的任务。传统的文件管理方式往往会在大量的文件和文件夹中迷失&#xff0c;而无法快速找…