Spark编程-SparkSQL

SparkSql能做些啥 

        Spark SQL的核心概念是DataFrame,它是一个分布式的数据集合,类似于关系数据库中的表。支持使用SQL语言直接对DataFrame进行查询,提供了丰富的内置函数和表达式,可以用于数据的转换、过滤和聚合等操作,支持多种数据源,包括Hive、Avro、Parquet、ORC、JSON和JDBC等。它可以读取和写入这些数据源,并且还支持将非结构化数据转换为结构化数据.

        Spark SQL在Hive兼容层面仅依赖HiveQL解析和Hive元数据,也就是说,从HQL被解析成抽象语法树(AST)起,就全部由Spark SQL接管了。Spark SQL执行计划生成和优化都由Catalyst(函数式关系查询优化框架)负责。

DataFrame与RDD的区别

        DataFrame的推出,让Spark具备GH了处理大规模结构化数据的能力,不仅比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能。Spark能够轻松实现从MySQL到DataFrame的转化,并且支持SQL查询。

        如上图,DataFrame和RDD的区别,RDD是分布式的 Java对象的集合,比如,RDD[Person]是以Person为类型参数,但是,Person类的内部结构对于RDD而言却是不可知的。DataFrame是一种以RDD为基础的分布式数据集,也就是分布式的Row对象的集合(每个Row对象代表一行记录),提供了详细的结构信息,也就是我们经常说的模式(schema),Spark SQL可以清楚地知道该数据集中包含哪些列、每列的名称和类型。
        和RDD一样,DataFrame的各种变换操作也采用惰性机制,只是记录了各种转换的逻辑转换路线图(是一个DAG图),不会发生真正的计算,这个DAG图相当于一个逻辑查询计划,最终,会被翻译成物理查询计划,生成RDD DAG,按照之前介绍的RDD DAG的执行方式去完成最终的计算得到结果。

SparkSession是什么       

        SparkSession是在Spark 2.0中引入的,作为替代SparkContext的新入口点。SparkSession是一个用于与Spark进行交互的主要入口,它封装了SparkContext、SQLContext和HiveContext的功能,并提供了更简洁、更一致的API。

SparkSession功能

        创建DataFrame和DataSet:SparkSession提供了创建DataFrame和DataSet的方法,这些方法可以从各种数据源(如文件、数据库、Hive表等)中读取数据,并将其转换为分布式数据集合。

        执行SQL查询:SparkSession允许使用Spark SQL模块提供的SQL语法来查询数据。它提供了SQL方法来执行SQL查询,并将结果返回为DataFrame。

        集成Hive:SparkSession内置了对Hive的支持,可以直接执行HiveQL查询和操作Hive表。

        与其他数据源的交互:SparkSession提供了用于读取和写入数据的方法,可以与各种数据源进行交互,如Parquet、Avro、JSON、CSV等。

如何创建DataFrame

例子1-已知Rdd创建DataFrame

代码

package SparkSQL//从一个已知rdd创建DataFrame
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
object DataFrame_create {def main(args:Array[String]):Unit = {//创建sparksessionval spark = SparkSession.builder.appName("dataframe_create").master("local").getOrCreate()//创建RDDval rdd = spark.sparkContext.parallelize(Seq(("zhugeliang",48),("guanyu",40),("xiangyu",19)))//定义schamaval schema = StructType((Seq(StructField("name",StringType,nullable = true),StructField("age",IntegerType,nullable = true))))//将RDD转化为Row对象val rowRDD = rdd.map(row => Row(row._1,row._2))//创建dataFrameval df = spark.createDataFrame(rowRDD,schema)//展示df.show()}}

运行结果

例子2-读取外部数据集创建DataFrame

 代码

package Sparksql
//      读取json文件创建
import org.apache.spark.sql.SparkSessionobject DataFrame_readFile {def main(args:Array[String]):Unit ={val spark = SparkSession.builder.appName("readFile").master("local").getOrCreate()//使支持RDDs转换为DataFrames及后续sql操作import spark.implicits._//读取json文件val df = spark.read.json("D:\\workspace\\spark\\src\\main\\Data\\package.json")//展示结果df.show()}}

 运行结果

例子3-编码创建DataFrame

代码

  package Sparksqlimport org.apache.spark.sql.SparkSessionimport org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}import org.apache.spark.sql.Rowobject DF_create_list {def main(args:Array[String]):Unit ={这里设置为local表示在本地运行val spark = SparkSession.builder.appName("DF_list").master("local").getOrCreate()//创建数据列表val data = Seq(("libai",43,"changan"),("jushi",48,"newYork"),("xinge",28,"jinan"))//定义schemaval schema = StructType(Seq(StructField("name",StringType,nullable = true),StructField("age",IntegerType,nullable = true),StructField("city",StringType,nullable = true)))//将数据转换为row对象val row = spark.sparkContext.parallelize(data).map{case(name,age,city) => Row(name,age,city)}val df = spark.createDataFrame(row,schema)df.show()}}

运行结果

 注:DataFrame的模式(Schema)

        代码定义了一个Spark SQL中DataFrame的模式(Schema),用于描述DataFrame中各列的名称和数据类型。
        StructType(Seq(...))表示创建一个结构类型(StructType)对象,用于存储DataFrame的模式信息。

        Seq(...)是一个包含多个元素的序列,每个元素都代表DataFrame的一个列。我们定义了三个列,分别是name、age和city。每个列都由StructField对象来表示,StructField的构造函数接受三个参数:列名、数据类型和是否可为空。
        StructField("name", StringType, nullable = true):表示一个名为name的列,数据类型为StringType,可以为空。

        StructField("age", IntegerType, nullable = true):表示一个名为age的列,数据类型为IntegerType,可以为空。

        StructField("city", StringType, nullable = true):表示一个名为city的列,数据类型为StringType,可以为空。
        即定义了一个包含三个列的模式,可以用于创建DataFrame。使用模式创建DataFrame时,可确保DataFrame的列具有正确的名称和数据类型。

常用DataFrame操作

      我使用了例子3的DataFrame,在原基础上进行操作。

       这里总结了日常使用中使用的DataFrame操作,主要有选择出多列进行打印,条件过滤,分组聚合,单列排序,多列排序,对列名进行重命名。

      //打印df      df.show
+-----+---+-------+
| name|age|   city|
+-----+---+-------+
|libai| 43|changan|
|jushi| 48|newYork|
|xinge| 28|  jinan|
+-----+---+-------+//打印模式信息df.printSchema()root|-- name: string (nullable = true)|-- age: integer (nullable = true)|-- city: string (nullable = true)//选择多列df.select(df("name"),df("age")+1).show()+-----+---------+
| name|(age + 1)|
+-----+---------+
|libai|       44|
|jushi|       49|
|xinge|       29|
+-----+---------+//条件过滤df.filter(df("age") > 30).show()
+-----+---+-------+
| name|age|   city|
+-----+---+-------+
|libai| 43|changan|
|jushi| 48|newYork|
+-----+---+-------+//分组聚合df.groupBy("age").count().show()+---+-----+
|age|count|
+---+-----+
| 28|    1|
| 48|    1|
| 43|    1|
+---+-----+//排序df.sort(df("age").desc).show()+-----+---+-------+
| name|age|   city|
+-----+---+-------+
|jushi| 48|newYork|
|libai| 43|changan|
|xinge| 28|  jinan|
+-----+---+-------+//多列排序df.sort(df("age").asc,df("city").asc).show()+-----+---+-------+
| name|age|   city|
+-----+---+-------+
|xinge| 28|  jinan|
|libai| 43|changan|
|jushi| 48|newYork|
+-----+---+-------+//对某列进行重名名df.select(df("city").as("area"),df("age")).show()+-------+---+
|   area|age|
+-------+---+
|changan| 43|
|newYork| 48|
|  jinan| 28|
+-------+---+

DataSet

概念

Spark SQL and DataFrames - Spark 2.2.3 Documentation,看官网

DataSet、DataFrame、RDD之间的关系

参考文章:

Spark2.1.0入门:DataFrame的创建_厦大数据库实验室博客,林子雨教授

Spark RDD(Resilient Distributed Datasets)论文 - 【布客】Spark 中文翻译

Spark SQL and DataFrames - Spark 2.2.3 Documentation   Spark官网

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

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

相关文章

功能测试也可以发现数据库相关的性能问题

很多同学认为功能测试和性能测试是严格分开的,功能测试人员无法发现性能问题。其实不是这样的,功能测试人员在验证功能时也可以发现性能问题;一些功能反而在功能测试环境不好验证,需要在性能环境上测试。 今天咱们就说一下测试涉及…

Leetcode 滑动窗口题目总结

(Leetcode 滑动窗口题目总结) 1: 3.无重复字符的最长子串 https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/子串 和 子序列的区别:字串是连续的,子序列是非连续的。快慢指针 i 和 j,…

前端面试题 —— React (二)

目录 一、React 组件中怎么做事件代理?它的原理是什么? 二、React.Component 和 React.PureComponent 的区别 三、Component, Element, Instance 之间有什么区别和联系? 四、React声明组件有哪几种方法,有什么不同&#xff1f…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求,领导要求整个QT项目中不要用UI方式来实现界面,这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下: 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…

【Docker】安全及日志管理

目录 一、Docker 安全及日志管理1.1 Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 1.2Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 1.3 Docker 架构缺陷与安全机制1. 容器之间的局域网攻击2. DDoS 攻击耗尽资源3. 有漏洞的系统调用4. 共享root用户权限 …

DEVICENET转ETHERNET/IP网关devicenet协议

捷米JM-EIP-DNT,你听说过吗?这是一款自主研发的ETHERNET/IP从站功能的通讯网关,它能够连接DEVICENET总线和ETHERNET/IP网络,从而解决生产管理系统中协议不同造成的数据交换互通问题。 这款产品在工业自动化领域可谓是一大利器&…

特定Adreno GPU的Android设备发生冻屏问题

1)特定Adreno GPU的Android设备发生冻屏问题 ​2)Unity版本升级后,iOS加载UnityFramework bundle闪退 3)关于RectTransfrom.rect在屏幕空间中表示的相关问题 4)Unity Mesh泄露问题 这是第345篇UWA技术知识分享的推送&a…

Java 8 Stream流:代码简洁之道

文章目录 前言一、filter二、map三、mapToInt、mapToLong、mapToDouble四、flatMap五、flatMapToInt、flatMapToLong、flatMapToDouble六、distinct七、sorted八、peek九、limit十、forEach十一、forEachOrdered十二、toArray十三、reduce十四、collect十五、min、max十六、cou…

Llama 2 来袭 - 在 Hugging Face 上玩转它

🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟! 引言 今天,Meta 发布了 Llama 2,其包含了一系列最先进的开放大语言模型,我们很高兴能够将其全面集成入 Hugging Face,并全力支持其发布。Llama 2 的社…

将AWS S3大文件文件上传相关的API集成为js文件,功能包括 多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示

地址 https://github.com/gk-1213/easy-s3/tree/main easy-s3 将AWS S3大文件文件上传相关的API集成为js文件,功能包括多文件并行上传、文件分片上传、断点续传、文件分片合成、上传暂停、取消上传、文件上传进度条显示。 暂时不包括文件分片下载相关功能&#…

linux下用docker安装mysql

1.mysql Docker镜像 docker pull mysql:[版本号 或 latest]例:docker pull mysql:5.7 2.查看拉取的docker镜像 docker images3.设置 Docker 卷 docker volume create mysql-data列出 Docker 已知的所有卷 docker volume ls4.运行一个 MySQL Docker 容器 docke…

2018年全国硕士研究生入学统一考试管理类专业学位联考写作试题——解析版

2018年1月真题 四、写作:第56~57小题,共65分。其中论证有效性分析30 分,论说文35分。 56.论证有效性分析: 分析下述论证中存在的缺陷和漏洞,选择若干要点,写一篇600字左右的文章,对该论证的有…

乐维监控 | 如何快速关闭网络设备所有端口

在运维监控实践中,由于不同的运维人员可能会关注不同的监控指标,因此乐维监控在监控网络设备时,会默认开启所有的端口,尽可能多的覆盖监控指标,避免遗漏重要指标。但是,这样又会带来新的问题,在…

golang,gin框架的请求参数(一)--推荐

golang,gin框架的请求参数(一) gin框架的重要性不过多的强调,重点就gin使用中的参数传递,获取进行梳理文件,满足使用需求。 获取前端请求参数的几种方法: 一、获取参数【浏览器地址获取参数】…

【论文阅读】定制化diffusion微调: DreamBooth原理

论文:DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 项目:DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 代码:Dreambooth-Stable-Diffusion 1. 任务简…

Kotlin基础(八):泛型

前言 本文主要讲解kotlin泛型,主要包括泛型基础,类型变异,类型投射,星号投射,泛型函数,泛型约束,泛型在Android中的使用。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 泛型基…

Unity XML1——XML基本语法

一、XML 概述 ​ 全称:可拓展标记语言(EXtensible Markup Language) ​ XML 是国际通用的,它是被设计来用于传输和存储数据的一种文本特殊格式,文件后缀一般为 .xml ​ 我们在游戏中可以把游戏数据按照 XML 的格式标…

JAVA线上问题排查降龙十八掌

现场问题一般有以下几种问题 CPU,磁盘,内存,GC问题,网络 同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。 …

windows中文界面乱码问题

我的便携是内部返修机,买来时就是英文版,在设置中改成简体中文就可以了,与中文版没有什么区别,已经升级成win11。windows自身的应用、360之类的界面都能正常显示,但是个别应用总是乱码,根据客服的提示设置一…

非线性质量弹簧阻尼器的神经网络仿真研究(Matlab代码Simulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…