当前位置: 首页 > news >正文

Spark SQL快速入门

 1. 了解Spark SQL

1.1 什么是Spark SQL

Spark SQL是spark的一个模块,用于处理海量的结构化数据。

1.2 Spark SQL有什么特点?优点是什么?

特点:

  • Spark SQL支持读取和写入多种格式的数据源,包括Parquet、JSON、CSV、JDBC等。
  • Spark SQL支持标准的SQL语言,包括SELECT、JOIN、GROUP BY等,还支持用户自定义函数(UDF)和窗口函数(Window Function)等高级功能。
  • Spark SQL支持将SQL查询结果转换为DataFrame或RDD,使得可以在Spark的其他API中继续处理数据。
  • Spark SQL可以和Spark的其他组件(如Spark Streaming、MLlib等)无缝集成,从而实现实时数据处理和机器学习等应用。

优点:

  • Spark SQL提供了一个统一的编程接口,将SQL查询和DataFrame API结合在一起,使得开发人员可以更方便地处理结构化数据。
  • Spark SQL采用了Spark的分布式计算框架,可以在大规模集群上运行,处理大量的数据。
  • Spark SQL支持延迟计算和数据缓存等优化技术,可以提高计算性能。
  • Spark SQL提供了丰富的数据源支持,可以方便地读取和写入各种数据格式的数据。
  • Spark SQL支持多种语言的API,包括Scala、Java、Python和R等,使得开发人员可以使用自己熟悉的语言进行开发。

2. Spark SQL概述

2.1 Spark SQL和Hive的区别与联系

相似之处:

  • Spark SQL和Hive都是基于Hadoop生态圈的大数据处理工具,都可以处理PB级别的数据。
  • Spark SQL和Hive都支持SQL语言,可以使用SQL查询语言来操作数据。
  • Spark SQL和Hive都支持数据存储在HDFS中。

不同之处:

  • Spark SQL是基于Spark的内存计算框架,而Hive是基于MapReduce的离线计算框架。因此,在某些情况下,Spark处理数据比Hive更快。
  • Spark SQL支持广泛的数据源类型,包括Hive、JSON、Parquet、JDBC等,而Hive只支持Hive数据源类型。
  • Spark SQL支持实时计算、流处理、机器学习等高级功能,而Hive只支持批处理。
  • Spark SQL可以通过Spark Streaming和Structured Streaming实现实时计算和流处理,而Hive需要使用额外的工具来实现流处理。

2.2 Spark SQL的数据抽象

 2.3 DataFrame概述

DataFrame是一种分布式的数据集合,它以表格形式(只能以表格的形式)表示,并且具有带有命名列的概念,类似于传统数据库或电子表格应用程序中的表格。DataFrame可以看作是一个关系型数据库中的一张表,或者是Python或R中的一个数据框架,但是不同的是,DataFrame是在分布式环境下运行的,可以处理大量的数据。

2.4 SparkSession对象

在RDD阶段,程序的执行入口为SparkContext。在spark2.0之后,推出了SparkSession对象,作为spark编码的统一入口对象。

3. DataFrame 详解

3.1 DataFrame 的组成

前面说过DataFrame是一个二维表结构,那么它的结构一定有三部分组成:行、列和表结构描述。

在结构层面:

  • StructType对象描述整个DataFrame的表结构
  • StructFiled对象描述一个列的信息

在数据层面:

  • Row对象记录一行数据
  • Column对象记录一列数据并包含列的信息

也就是说,Column是包含单个StructFiled对象的,所有的Column组成全部的StructType对象。

3.2 代码构建

下面用一个例子解释各个api的作用及相关参数的含义

from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
import reif __name__ == '__main__':# 构建入口对象spark = SparkSession.builder. \appName("test"). \master("local[*]"). \getOrCreate()sc = spark.sparkContext# 基于RDD转换成DataFramerdd = sc.textFile("一个数据文件,格式形如:'username, age'"). \map(lambda x: x.split(",")). \map(lambda x: (x[0], int(x[1])))  # 将str类型的年龄变为int类型# 构建DataFrame对象# 参数1 被转换的RDD# 参数2 指定列名,通过list的形式指定,按照顺序依次提供字符串名称即可df = spark.createDataFrame(rdd, schema=['name', 'age'])# 打印表结构df.printSchema()# 打印df中的数据# 参数1表示展示出多少条数据,默认不传的话是20# 参数2表示是否对列进行截断,如果列的数据长度超过20个字符串长度,后续的内容不显示以...代皙#如果False表示不阶产全部显示,默认是Truedf.show(20, False)

上面的代码是基于RDD转换成DataFrame的构建方法,下面我们用基于StructType的方法构建。

schema = StructType().add("name", StringType(), nullable=True). \add("age", IntegerType(), nullable=False)

3.3 读取外部数据

通过Spark SQL的统一api进行数据读取,并构建DataFrame

 format是指支持读取的数据格式,schema就是配置StructType的信息,指定数据的类型和名称

3.4 DataFrame的编程风格

DataFrame的编程风格支持两种:DSL和SQL语法风格。

DSL风格指的是使用Spark SQL提供的DataFrame API进行编程,可以支持更加复杂的数据处理操作。DSL风格的代码通常比SQL语法风格的代码更加直观和易于调试,因为DSL代码中可以使用编程语言的各种特性和工具来处理数据,比如函数、变量、循环等。

代码:

from pyspark.sql import SparkSessionspark = SparkSession.builder.appName("example").getOrCreate()# 读取csv数据文件
df = spark.read.format("csv")\.option("header", True)\.option("inferSchema", True)\.load("data.csv")# 进行数据处理
result = df.filter(df["age"] > 25)\.groupBy("gender")\.agg({"salary": "avg"})\.orderBy("gender")# 输出结果
result.show()

使用SQL语法风格的编程方式,可以直接使用SQL语句对DataFrame进行查询和数据处理。SQL语法风格的代码通常比DSL风格的代码更加简洁和易于理解,因为SQL语句可以直接表达数据处理的逻辑。

代码:

from pyspark.sql import SparkSessionspark = SparkSession.builder.appName("example").getOrCreate()# 读取csv数据文件
df = spark.read.format("csv")\.option("header", True)\.option("inferSchema", True)\.load("data.csv")# 创建临时视图
df.createOrReplaceTempView("people")# 使用SQL语句进行查询
result = spark.sql("""SELECT gender, AVG(salary) as avg_salaryFROM peopleWHERE age > 25GROUP BY genderORDER BY gender
""")# 输出结果
result.show()

相关文章:

Spark SQL快速入门

1. 了解Spark SQL 1.1 什么是Spark SQL Spark SQL是spark的一个模块,用于处理海量的结构化数据。 1.2 Spark SQL有什么特点?优点是什么? 特点: Spark SQL支持读取和写入多种格式的数据源,包括Parquet、JSON、CSV、…...

linux+Jenkins+飞书机器人发送通知(带签名)

文章目录 如何使用在linux 上安装python 环境发送消息python脚本把脚本上传倒linux上 jenkins 上执行脚本 如何使用 自定义机器人使用指南飞书官网https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot 在linux 上安装python 环境 yum install python3 python…...

react hooks

1 useEffect(setup,dependencies) 使用object.is来比较每个依赖项和它先前的值 依赖项为空数组的effect不会在组件任何props和state发生改变时重新运行 当useEffect依赖于外部传入props对象时,容易造成死循环 需要对依赖对象进行深比较 import { isEqual } from…...

一起学数据结构(1)——复杂度

目录 1. 时间复杂度: 1.1 时间复杂度的概念: 1.2 时间复杂度的表示及计算: 1.3 较为复杂的时间复杂度的计算: 2. 空间复杂度: 2.1 空间复杂度的概念: 2.2 空间复杂度的计算: 1. 时间复杂度…...

<el-date-picker>组件选择开始时间,结束时间自动延长30min

背景&#xff1a;选择开始时间&#xff0c;结束时间自动增加30分钟&#xff0c;结束时间也可重新选择&#xff0c;如图&#xff1a; <el-form-item label"预约开始时间" prop"value1"><el-date-pickersize"large"v-model"ruleForm…...

eslint-webpack-plugin

说明&#xff1a;现在eslint已经弃用了eslint-loader,如果要安装来使用的话&#xff0c;会报错&#xff0c;烦死人 大概的报错信息如下&#xff1a; ERROR in ./src/index.js Module build failed (from ./node_modules/eslint-loader/dist/cjs.js): TypeError: Cannot read …...

logback中文一直是乱码,logback中文问号

logback一直是乱码 方案一加上UTF-8 方案二我这边方案一不行 在启动参数加上 -Dfile.encodingutf-8 这个竟然就可以了...

C++之文件操作

1.C文件操作 C中文件操作头文件:fstream。   文件类型&#xff1a;文件文件和二进制文件。 文件操作三大类&#xff1a;     ofstream 写操作     ifstream 读操作     fstream:读写操作 文件打开方式&#xff1a; 标志说明ios::in只读ios::out只写,文件不存在则…...

CentOS 7.6安装 MongoDB 5.0.2

https://developer.aliyun.com/article/983777 我遇到的问题&#xff1a;如何以集群的方式启动&#xff0c;使用replSet的方式进行启动&#xff1a; 需要在配置文件上加上replSet的信息 port27017 #端口 bind_ip0.0.0.0 #默认是127.0.0.1 dbpath/usr/local/mongodb/data #数据…...

Windows下安装python3教程

参考:https://blog.csdn.net/kailingr/article/details/128193083 一、安装步骤图解 准备工作&#xff1a; 进官网https://www.python.org/下载Python 安装包&#xff0c;注意&#xff1a;Python 3.9不能在Windows 7或更早版本上使用 安装&#xff1a; 1.下载完之后双击该文…...

opencv-27 阈值处理 cv2.threshold()

怎么理解阈值处理? 阈值处理&#xff08;Thresholding&#xff09;是一种常用的图像处理技术&#xff0c;在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类&#xff0c;将像素值大于或小于阈值的部分分为两个不同的类别&…...

AAOS 音频焦点请求

文章目录 前言基本概念提供给应用来获取音频焦点的apiAAOS中的音频焦点管理交互矩阵duck的实现流程AAOS 测试应用kitchensink焦点相关 前言 本文章的目标是首先了解Android中音频焦点的基本概念&#xff0c;理解代码中相关音频焦点的使用方法。其次理解AAOS 中相关交互矩阵概念…...

订单系统中的幂等实现

一.订单提交的例子 一个订单生成并支付的过程&#xff0c;大致为&#xff1a;用户点击前端页面提交订单->后端根据此次提交信息生成订单->用户确认订单并进行支付操作->支付成功。 主要分为前端层面&#xff0c;后端系统层面&#xff0c;数据库层面。前端层面不详述…...

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试&#xff1a; 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…...

列表、张量、向量和矩阵的关系

在数学和编程中&#xff0c;列表、张量、向量和矩阵之间有一定的关系。这些概念在不同领域和语境中有略微不同的定义和用法&#xff0c;以下是它们之间的一般关系&#xff1a; 列表&#xff08;List&#xff09;&#xff1a; 列表是编程语言中的一种数据结构&#xff0c;用于存…...

华为数通HCIP-ISIS高级

isis区域间的互访 1、L2区域 to L1区域 在L1区域发布的路由会以L1-LSP在L1区域内传递&#xff0c;到达L1-2路由器时&#xff0c;L1-2路由器会将该L1-LSP转换为L2-LSP在L2区域内传递&#xff1b; 因此L2区域的设备可以学习到L1区域的明细路由&#xff0c;进行访问&#xff1b;…...

CorelDraw怎么做立体字效果?CorelDraw制作漂亮的3d立体字教程

1、打开软件CorelDRAW 2019&#xff0c;用文本工具写上我们所需要的大标题。建议字体选用比较粗的适合做标题的字体。 2、给字填充颜色&#xff0c;此时填充的颜色就是以后立体字正面的颜色。我填充了红色&#xff0c;并加上了灰色的描边。 3、选中文本&#xff0c;单击界面左侧…...

大致了解Redis

为了保证数据的可靠性&#xff0c;Redis 需要在磁盘上读写 AOF 和 RDB&#xff0c;但在高并发场景里&#xff0c;这就会直接带来两个新问题&#xff1a;一个是写 AOF 和RDB 会造成 Redis 性能抖动&#xff0c;另一个是 Redis 集群数据同步和实例恢复时&#xff0c;读 RDB 比较慢…...

javaweb会话技术

cookie的入门使用 package com.hspedu.cookie;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import …...

android app控制ros机器人三(android登录界面)

接下来是二次开发的具体环节了&#xff0c;由于存在用户需求&#xff0c;用到ros-mobile不多&#xff0c;更偏向于android开发。 用ppt画了简单的展示界面&#xff0c;与用后交流界面的功能布局。先开发一代简易版本的app&#xff0c;后续可以丰富完善。ctrlcv上线。 登录界面…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...