sparkSQL基础_spark 创建用户类-程序员宅基地

目录

1.sparksql概述

1.1、什么是Spark SQL

1.2、SparkSQL的数据源

1.3、SparkSQL底层架构

2. sparksql的四大特性

2.1、易整合

2.2、统一的数据源访问

2.3、兼容hive

2.4、支持标准的数据库连接

3. DataFrame概述

3.1、DataFrame是什么

3.2、DataFrame和RDD的优缺点

3.4、DataFrame常用操作

4. DataSet概述

4.1、DataSet是什么

4.2、RDD、DataFrame、DataSet的区别

4.3、构建DataSet(四种方法)


1.sparksql概述

1.1、什么是Spark SQL

  • Spark SQL is Apache Spark's module for working with structured data.
  • SparkSQL是apache Spark用来理结构化数据的一个模块
  • SparkSQL支持查询原生的RDD。 RDD是Spark平台的核心概念,是Spark能够高效的处理大数据的各种场景的基础。
  • 能够在Scala中写SQL语句。支持简单的SQL语法检查,能够在Scala中写Hive语句访问Hive数据,并将结果取回作为RDD使用。

1.2、SparkSQL的数据源

SparkSQL的数据源可以是JSON类型的字符串,JDBC,Parquent,Hive,HDFS等。

1.3、SparkSQL底层架构

(1)首先拿到sql后解析一批未被解决的逻辑计划

(2)经过分析得到分析后的逻辑计划

(3)再经过一批优化规则转换成一批最佳优化的逻辑计划

(4)再经过SparkPlanner的策略转化成一批物理计划

(5)最后经过消费模型转换成一个个的Spark任务执行。

2. sparksql的四大特性

2.1、易整合

  • 将SQL查询与Spark程序无缝混合;
  • 可以使用不同的语言进行代码开发:
    • java
    • scala
    • python

2.2、统一的数据源访问

  • 以相同的方式连接到任何数据源;
  • sparksql后期可以采用一种统一的方式去对接任意的外部数据源:

                   dataFrame = sparkSession.read.文件格式的方法名("该文件格式的路径")

2.3、兼容hive

  • sparksql可以支持hivesql

2.4、支持标准的数据库连接

  • sparksql支持标准的数据库连接JDBC或者ODBC

3. DataFrame概述

3.1、DataFrame是什么

  • DataFrame是一种以RDD为基础的分布式数据集类似于传统数据库的二维表格
  • DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型,但底层做了更多的优化;
  • DataFrame可以从很多数据源构建
    • 比如:已经存在的RDD、结构化文件、外部数据库、Hive表。
  • RDD可以把它内部元素看成是一个java对象;
  • DataFrame可以把内部是一个Row对象,它表示一行一行的数据;
  • 可以把DataFrame这样去理解
    • RDD+schema元信息
  • dataFrame相比于rdd来说,多了对数据的描述信息(schema元信息)

3.2、DataFrame和RDD的优缺点

(1)RDD

 

优点:

           1、编译时类型安全:开发会进行类型检查,在编译的时候及时发现错误;

           2、具有面向对象编程的风格。

缺点:

           1、构建大量的java对象占用了大量heap堆空间导致频繁的GC:

                 RDD它的数据量比较大,后期都需要存储在heap堆中,而heap堆中的内存空间有限,出现频繁的垃圾回收(GC),程序在进行垃圾回收的过程中,所有的任务都是暂停,影响程序执行的效率

           2、数据的序列化和反序列性能开销很大

                  在分布式程序中,对象(对象的内容和结构)是先进行序列化,发送到其他服务器,进行大量的网络传输,然后接受到这些序列化的数据之后,再进行反序列化来恢复该对象。

(2)DataFrame

  • DataFrame引入了schema元信息和off-heap(堆外空间)

优点:

           1、DataFrame引入off-heap,大量的对象构建直接使用操作系统层面上的内存,不在使用heap堆中的内存,这样一来heap堆中的内存空间就比较充足,不会导致频繁GC,程序的运行效率比较高,它是解决了RDD构建大量的java对象占用了大量heap堆空间,导致频繁的GC这个缺点。

           2、DataFrame引入了schema元信息---就是数据结构的描述信息,后期spark程序中的大量对象在进行网络传输的时候,只需要把数据的内容本身进行序列化就可以,数据结构信息可以省略掉。这样一来数据网络传输的数据量是有所减少,数据的序列化和反序列性能开销就不是很大了。它是解决了RDD数据的序列化和反序列性能开销很大这个缺点。

缺点:

  • DataFrame引入了schema元信息和off-heap(堆外)它是分别解决了RDD的缺点,同时它也丢失了RDD的优点。

           1、编译时类型不安全

                 编译时不会进行类型的检查,这里也就意味着前期是无法在编译的时候发现错误,只有在运行的时候才会发现

           2、不在具有面向对象编程的风格

3.3、 读取文件构建DataFrame

(1) 读取文本文件创建DataFrame

第一种方式:读取text文件

//创建dataFrame
val personDF=spark.read.text("/person.txt")
//打印schema信息
personDF.printSchema
//展示数据
personDF.show

第二种方式:调用toDF方法将rdd转换成dataFrame

//加载数据
val rdd1=sc.textFile("/person.txt").map(x=>x.split(" "))
//定义一个样例类
case class Person(id:String,name:String,age:Int)
//把rdd与样例类进行关联
val personRDD=rdd1.map(x=>Person(x(0),x(1),x(2).toInt))
//把rdd转换成DataFrame
val personDF=personRDD.toDF

//打印schema信息
personDF.printSchema
//展示数据
personDF.show

(2)读取json文件创建DataFrame

val peopleDF=spark.read.json("/people.json")  //读取json文件创建dataFrame
 
//打印schema信息
peopleDF.printSchema
//展示数据
peopleDF.show

(3)读取parquet文件创建DataFrame

//创建DataFrame
val usersDF=spark.read.parquet("/users.parquet")

//打印schema信息
usersDF.printSchema
//展示数据
usersDF.show

(4)读取JDBC中的数据创建DataFrame(MySql为例)

val mysqlDF:DataFrame = sparkSession.read.jdbc(url,tableName,properties)

(5)读取Hive中的数据加载成DataFrame

 val dataFrame = sparkSession.sql("select * from people")

(6) 直接创建

 val dataFrame:DataFrame = sparkSession.createDataFrame(rowRDD,schema)

3.4、DataFrame常用操作

(1)DSL风格语法

sparksql中的DataFrame自身提供了一套自己的Api,可以去使用这套api来做相应的处理。

//加载数据
val rdd1=sc.textFile("/person.txt").map(x=>x.split(" "))
//定义一个样例类
case class Person(id:String,name:String,age:Int)
//把rdd与样例类进行关联
val personRDD=rdd1.map(x=>Person(x(0),x(1),x(2).toInt))
//把rdd转换成DataFrame
val personDF=personRDD.toDF

//打印schema信息
personDF.printSchema
//展示数据
personDF.show

//查询指定的字段
personDF.select("name").show
personDF.select($"name").show
personDF.select(col("name")).show

//实现age+1
 personDF.select($"name",$"age",$"age"+1).show

//实现age大于30过滤
 personDF.filter($"age" > 30).show

//按照age分组统计次数
 personDF.groupBy("age").count.show 

//按照age分组统计次数降序
 personDF.groupBy("age").count().sort($"count".desc).show

(2)SQL风格语法

  • 可以把DataFrame注册成一张表,然后通过sparkSession.sql(sql语句)操作。

//DataFrame注册成表
personDF.createTempView("person")

//使用SparkSession调用sql方法统计查询
spark.sql("select * from person").show
spark.sql("select name from person").show
spark.sql("select name,age from person").show
spark.sql("select * from person where age >30").show
spark.sql("select count(*) from person where age >30").show
spark.sql("select age,count(*) from person group by age").show
spark.sql("select age,count(*) as count from person group by age").show
spark.sql("select * from person order by age desc").show

4. DataSet概述

4.1、DataSet是什么

DataSet是分布式的数据集合,Dataset提供了强类型支持,也是在RDD的每行数据加了类型约束

DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及使用了Spark SQL优化的执行引擎。

4.2、RDD、DataFrame、DataSet的区别

(1)RDD

RDD:弹性分布式数据集;不可变、可分区、元素可以并行计算的集合。

优点:

  1. RDD编译时类型安全:编译时能检查出类型错误;
  2. 面向对象的编程风格:直接通过类名点的方式操作数据。

缺点:

  1. 序列化和反序列化的性能开销很大,大量的网络传输;
  2. 构建对象占用了大量的heap堆内存,导致频繁的GC(程序进行GC时,所有任务都是暂停)

RDD的数据结构为:

(2)DataFrame

DataFrame以RDD为基础的分布式数据集。

优点:

  1. DataFrame带有元数据schema,每一列都带有名称和类型。
  2. DataFrame引入了off-heap,构建对象直接使用操作系统的内存,不会导致频繁GC。
  3. DataFrame可以从很多数据源构建;
  4. DataFrame把内部元素看成Row对象,表示一行行的数据。
  5. DataFrame=RDD+schema

缺点:

  1. 编译时类型不安全;
  2. 不具有面向对象编程的风格。

DataFrame的数据结构为:(类似于二维表)

(3)Dataset

DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。
(1)DataSet可以在编译时检查类型;
(2)并且是面向对象的编程接口。

(DataSet 结合了 RDD 和 DataFrame 的优点,并带来的一个新的概念 Encoder。当序列化数据时,Encoder 产生字节码与 off-heap 进行交互,能够达到按需访问数据的效果,而不用反序列化整个对象。)

Dataset中的数据结构:

或者

(4)三者之间的转换:

(1)RDD转换成DataFrame或DataSet,需先定义一个样例类,再将RDD与样例类进行关联,再调用.toDF方法或.toDS方法。

            //定义一个样例类
           case class Person(id:String,name:String,age:Int)
          //把rdd与样例类进行关联
           val personRDD=rdd1.map(x=>Person(x(0),x(1),x(2).toInt))
           //把rdd转换成DataFrame

            //需要手动导入隐式转换
           import spark.implicits._
           val personDF=personRDD.toDF

(2)而DataFrame或DataSet转换成RDD,只需调用.rdd方法即可。

          val rdd1=dataFrame.rdd

           val rdd2=dataSet.rdd

(3)DataFrame转换成DataSet:val dataSet=dataFrame.as[强类型]

(4)DataSet转换成DataFrame:val dataFrame=dataSet.toDF

4.3、构建DataSet(四种方法)

(1)通过sparkSession调用createDataset方法

 ds=spark.createDataset(1 to 10) //scala集合
 val ds=spark.createDataset(sc.textFile("/person.txt"))  //rdd

(2)使用scala集合和rdd调用toDS方法

textFile("/person.txt").toDS
List(1,2,3,4,5).toDS

(3)把一个DataFrame转换成DataSet

dataSet=dataFrame.as[强类型]

(4)通过一个DataSet转换生成一个新的DataSet

List(1,2,3,4,5).toDS.map(x=>x*10)

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengge18306/article/details/106154896

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签