SparkSQL学习02-编程入口

文章目录

    • 1 DataFrame的构建方式
      • 方式一:JavaBean+反射的方式
        • 1.1 创建Scala类
        • 1.2 创建Scala对象
      • 方式二:动态编码的方式
    • 2 DataSet的构建方式
    • 3 RDD和DataFrame以及DataSet之间的相互转换
      • 3.1【RDD-->DataFrame】和【RDD-->DataSet】
      • 3.2【DataFrame-->RDD】和【DataFrame-->DataSet】
      • 3.3【DataSet-->RDD】和【DataSet-->DataFrame】

​​​​​​​​

1 DataFrame的构建方式

方式一:JavaBean+反射的方式

1.1 创建Scala类

在这里插入图片描述

package _02SparkSQL// 统一的样例类
case class _02student(id:Int,name:String,gender:String,age:Int)
1.2 创建Scala对象

在这里插入图片描述

package _02SparkSQLimport org.apache.spark.sql.{DataFrame, SparkSession}object _02createDataFrame {//使用JavaBean方式+反射def main(args: Array[String]): Unit = {//创建SparkSession对象val spark = SparkSession.builder().appName("CreateDataFrame").master("local[*]").getOrCreate()val list = List(new _02student(id =1,name="张三",gender = "男",age=18),new _02student(id =1,name="李四",gender = "女",age=26),new _02student(id =1,name="王五",gender = "男",age=34),new _02student(id =1,name="赵六",gender = "女",age=45),)//需要提供隐式转换才可以进行操作(需要使用SparkSession对象进行操作)import spark.implicits._val frame: DataFrame = list.toDF()frame.printSchema()/*root|-- id: integer (nullable = false)|-- name: string (nullable = true)|-- gender: string (nullable = true)|-- age: integer (nullable = false)*/frame.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|张三|    男| 18||  1|李四|    女| 26||  1|王五|    男| 34||  1|赵六|    女| 45|+---+----+------+---+*/}
}

方式二:动态编码的方式

说明:这里学习三个新的类
【Row】:代表的是二维表中的一行记录,或者就是一个Java对象
【StructType】:是该二维表的元数据信息,是StructField的集合
【StructField】:是该二维表中某一个字段/列的元数据信息(主要包括列名,类型,是否可以为null)
总结:
这两种方式,都是非常常用,但是动态编程更加的灵活,因为javabean的方式的话,提前要确定好数据格式类型,后期无法做改动。

package _02SparkSQLimport org.apache.spark.sql.types.{DataTypes, StructField, StructType}
import org.apache.spark.sql.{DataFrame, Row, SparkSession}object _03createDataFrame {//动态编程方式def main(args: Array[String]): Unit = {// 构建SparkSession对象val spark =SparkSession.builder().appName("03createDataFrame").master("local[*]").getOrCreate()//需要构建RDD数据//因为SparkSession的底层是包含是SparkContext对象val row = spark.sparkContext.makeRDD(List(// 需要使用Row来表示一行的内容Row(1,"张三","男",18),Row(2,"李四","女",23),Row(3,"王五","男",35),Row(4,"赵六","女",56)))//表对应的元数据信息【列,列数据类型,是否可以为空】val schema = StructType(List(//需要根据Row中列的个数来决定提供StructField的个数StructField("id",DataTypes.IntegerType,false),StructField("name",DataTypes.StringType,false),StructField("gender",DataTypes.StringType,false),StructField("age",DataTypes.IntegerType,false),))//构建DataFrame对象val frame: DataFrame = spark.createDataFrame(row, schema)frame.printSchema()/*运行结果:root|-- id: integer (nullable = false)|-- name: string (nullable = false)|-- gender: string (nullable = false)|-- age: integer (nullable = false)*/frame.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|张三|    男| 18||  2|李四|    女| 23||  3|王五|    男| 35||  4|赵六|    女| 56|+---+----+------+---+*/}
}

2 DataSet的构建方式

DataSet是DataFrame的升级版,创建方式和DataFrame类似,但有不同
在创建Dataset的时候,需要注意数据的格式,必须使用 == caseclass ==,或者基本数据类型,同时需要通过import spark.implicts._来完成数据类型的编码,从而抽取出对应的元数据信息,否则编译无法通过

package _02SparkSQLimport org.apache.spark.sql.{Dataset, SparkSession}object _04createDataSet {def main(args: Array[String]): Unit = {//创建SparkSession对象val session = SparkSession.builder().appName("CreateDataSet").master("local[*]").getOrCreate()//提供List集合存储数据val list = List(new _02student(id =1,name="咪咪",gender = "男",age=6),new _02student(id =2,name="凯凯",gender = "男",age=8),new _02student(id =3,name="超超",gender = "男",age=7),new _02student(id =4,name="大宝",gender = "女",age=9),)//通过List集合构建DataSet对象(List集合中存储的是样例类对象)import session.implicits._val ds: Dataset[_02student] = list.toDS()ds.printSchema()/*运行结果:root|-- id: integer (nullable = false)|-- name: string (nullable = true)|-- gender: string (nullable = true)|-- age: integer (nullable = false)*/ds.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*///支持基本数据类型val list2 = List(1,2,3,4,5,6,7,8)val ds2: Dataset[Int] = list2.toDS()ds2.printSchema()/*运行结果:root|-- value: integer (nullable = false)*/ds2.show()/*运行结果:+-----+|value|+-----+|    1||    2||    3||    4||    5||    6||    7||    8|+-----+*/
}
}

3 RDD和DataFrame以及DataSet之间的相互转换

3.1【RDD–>DataFrame】和【RDD–>DataSet】

package _02SparkSQLimport org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}object _05RDDToDataFrame {def main(args: Array[String]): Unit = {//创建SparkSession对象val spark= SparkSession.builder().appName("RDDToDataFrame").master("local[*]").getOrCreate()val rdd = spark.sparkContext.makeRDD(List(new _02student(id =1,name="咪咪",gender = "男",age=6),new _02student(id =2,name="凯凯",gender = "男",age=8),new _02student(id =3,name="超超",gender = "男",age=7),new _02student(id =4,name="大宝",gender = "女",age=9),))println(rdd.collect().toBuffer)/*运行结果:ArrayBuffer(_02student(1,咪咪,男,6),_02student(2,凯凯,男,8),_02student(3,超超,男,7),_02student(4,大宝,女,9))*//*** RDD 转换为 DataFrame*///需要使用SparkSession所创建的对象进行隐式转换导入操作import spark.implicits._val frame: DataFrame = rdd.toDF()frame.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*//*** RDD 转换为 DataSet*/val dataset: Dataset[_02student] = rdd.toDS()dataset.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*/}
}

3.2【DataFrame–>RDD】和【DataFrame–>DataSet】

package _02SparkSQLimport org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}object _05RDDToDataFrame {def main(args: Array[String]): Unit = {//创建SparkSession对象val spark= SparkSession.builder().appName("RDDToDataFrame").master("local[*]").getOrCreate()val rdd = spark.sparkContext.makeRDD(List(new _02student(id =1,name="咪咪",gender = "男",age=6),new _02student(id =2,name="凯凯",gender = "男",age=8),new _02student(id =3,name="超超",gender = "男",age=7),new _02student(id =4,name="大宝",gender = "女",age=9),))println(rdd.collect().toBuffer)/*运行结果:ArrayBuffer(_02student(1,咪咪,男,6),_02student(2,凯凯,男,8),_02student(3,超超,男,7),_02student(4,大宝,女,9))*//*** RDD 转换为DataFrame*///需要使用SparkSession所创建的对象进行隐式转换导入操作import spark.implicits._val frame: DataFrame = rdd.toDF()frame.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*//*** DataFrame转换为RDD*///Row是DataFrame动态构建时提供的行对象val rdd1: RDD[Row] = frame.rddrdd1.foreach(row=>{//按照列的序号获取即可(序号与数组下标一样,从0开始,到长度-1)println(row)/*运行结果:[2,凯凯,男,8][4,大宝,女,9][1,咪咪,男,6][3,超超,男,7]*///取值的时候使用getxxx方法,xxx就是列的数据类型val id = row.getInt(0)val name = row.getString(1)val gender = row.getString(2)val age = row.getAs[Int]("age")println(id+" "+name+" "+gender+" "+age)/*运行结果:3 超超 男 71 咪咪 男 62 凯凯 男 84 大宝 女 9*/})/*** DataFrame转换为DataSet*///DataFrame其实就是DataSet的特例val dataset2: Dataset[_02student] = frame.as[_02student]dataset2.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*/}
}

3.3【DataSet–>RDD】和【DataSet–>DataFrame】

package _02SparkSQLimport org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}object _05RDDToDataFrame {def main(args: Array[String]): Unit = {//创建SparkSession对象val spark= SparkSession.builder().appName("RDDToDataFrame").master("local[*]").getOrCreate()val rdd = spark.sparkContext.makeRDD(List(new _02student(id =1,name="咪咪",gender = "男",age=6),new _02student(id =2,name="凯凯",gender = "男",age=8),new _02student(id =3,name="超超",gender = "男",age=7),new _02student(id =4,name="大宝",gender = "女",age=9),))println(rdd.collect().toBuffer)/*运行结果:ArrayBuffer(_02student(1,咪咪,男,6), _02student(2,凯凯,男,8), _02student(3,超超,男,7), _02student(4,大宝,女,9))*///RDD 转换为DataSetval dataset: Dataset[_02student] = rdd.toDS()dataset.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*//*** DataSet转换为RDD*/val rdd2: RDD[_02student] = dataset.rddprintln(rdd2.collect().toBuffer)/*运行结果:ArrayBuffer(_02student(1,咪咪,男,6), _02student(2,凯凯,男,8), _02student(3,超超,男,7), _02student(4,大宝,女,9))*//*** DataSet转换为DataFrame*/val frame1: DataFrame = dataset.toDF()frame1.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*/}
}

附上完整版代码:

package _02SparkSQLimport org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}object _05RDDToDataFrame {def main(args: Array[String]): Unit = {//创建SparkSession对象val spark= SparkSession.builder().appName("RDDToDataFrame").master("local[*]").getOrCreate()val rdd = spark.sparkContext.makeRDD(List(new _02student(id =1,name="咪咪",gender = "男",age=6),new _02student(id =2,name="凯凯",gender = "男",age=8),new _02student(id =3,name="超超",gender = "男",age=7),new _02student(id =4,name="大宝",gender = "女",age=9),))println(rdd.collect().toBuffer)/*运行结果:*///RDD 转换为DataFrame//需要使用SparkSession所创建的对象进行隐式转换导入操作import spark.implicits._val frame: DataFrame = rdd.toDF()frame.show()/*运行结果:*///RDD 转换为DataSetval dataset: Dataset[_02student] = rdd.toDS()dataset.show()/*运行结果:*///DataFrame转换为RDD//Row是DataFrame动态构建时提供的行对象val rdd1: RDD[Row] = frame.rddrdd1.foreach(row=>{//按照列的序号获取即可(序号与数组下标一样,从0开始,到长度-1)println(row)/*运行结果:[2,凯凯,男,8][4,大宝,女,9][1,咪咪,男,6][3,超超,男,7]*///取值的时候使用getxxx方法,xxx就是列的数据类型val id = row.getInt(0)val name = row.getString(1)val gender = row.getString(2)val age = row.getAs[Int]("age")println(id+" "+name+" "+gender+" "+age)/*运行结果:3 超超 男 71 咪咪 男 62 凯凯 男 84 大宝 女 9*/})//DataFrame转换为DataSet//DataFrame其实就是DataSet的特例val dataset2: Dataset[_02student] = frame.as[_02student]dataset2.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*///DataSet转换为RDDval rdd2: RDD[_02student] = dataset.rddprintln(rdd2.collect().toBuffer)/*运行结果:ArrayBuffer(_02student(1,咪咪,男,6),_02student(2,凯凯,男,8),_02student(3,超超,男,7),_02student(4,大宝,女,9))*///DataSet转换为DataFrameval frame1: DataFrame = dataset.toDF()frame1.show()/*运行结果:+---+----+------+---+| id|name|gender|age|+---+----+------+---+|  1|咪咪|    男|  6||  2|凯凯|    男|  8||  3|超超|    男|  7||  4|大宝|    女|  9|+---+----+------+---+*/}
}

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

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

相关文章

java基础之 SPI机制

SPI机制说明 什么是SPI Service Provider Interface 机制是Java提供的一套用来被第三方实现或扩展的API,他可以用来启用框架扩展和替换组件。通过“基于接口的编程 策略模式 配置文件”组合实现的动态加载机制。SPI机制为某个接口寻找服务实现的机制,…

二叉树基础知识总结

目录 二叉树基础知识 概念 : 根节点的五个形态 : 特殊的二叉树 满二叉树 : 完全二叉树 : 二叉搜索树 : 平衡二叉搜索树 : 二叉树的性质 : 二叉树的存储结构 二叉树的顺序存储结构 二叉树的链式存储结构 二叉树的遍历方式 : 基础概念 前中后遍历 层序遍历 :…

【Redis】理论进阶篇------浅谈Redis的缓存穿透和雪崩原理

一、缓存穿透 1、概念 缓存穿透(查不到数据),是指当用户想要查询数据的时候,会先去Redis中取命中,如果Redis中没有该数据,那么就会向数据库中去查找数据。如果数据库中也没有,则该次查询结果失…

Spring学习笔记(五)--Spring的AOP模块

一、AOP的底层原理 AOP的底层原理是动态代理,动态代理有两种方式:JDK动态代理和CGLib动态代理,在有接口的实现类时我们通常用JDK的动态代理方式(默认情况)为类创建代理对象,JDK的动态代理方式可以实现无入…

ORM中常用的字段和参数,正反向概念

django表查询测试环境搭建 首先,在此之前我们先来回顾一下之前学习的orm内容 1. django自带一个小型的sqlite3的小型数据库 但是这个数据库的功能非常有限,并且针对日期类型的数据兼容性很差 2. 切换数据库数据(MySQL) 2.1 在django1.x版本中你需要在_…

PotPlayer+Alist挂载并播放网盘视频

文章目录 说明技术WebDAVPotPlayer 操作步骤一:Alist开启WebDAV代理二:PotPlayer连接Alist 说明 Alist网页端播放视频受限,主要是文件大于20MB,由于官方限制,无法播放需要使用user-agent修改插件,设置百度…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-24-处理单选和多选按钮-上篇

1.简介 在工作和生活中,经常会遇到我们需要进行选择的情况,比如勾选我们选择性别,男女两个性别总是不能同时选中的,再比如我们在选择兴趣爱好时,我们可以选择多个自己感兴趣的话题,比如:篮球、…

sqllabs第46关 order by 注入

简介:(order by注入-错误回显-POST注入) 请求方法:POST 方法:order by注入错误回显数字型注入 先了解下 order by参数注入: order by 注入是指其后面的参数是可控的, order by 不同于我们在 whe…

gem5学习(23):经典缓存——Classic Caches

目录 一、Interconnects 1、Crossbars 二、Debugging 官网教程:gem5: Classic caches 默认缓存是一个带有MSHR(未命中状态保持寄存器)和WB(写缓冲区)的非阻塞缓存,用于读取和写入未命中。缓存还可以启用…

[java基础揉碎]this

引出this: 什么是this: java虚拟机会给每个对象分配 this,代表当前对象。 这里的this就是new出来的这个对象 this的本质: this是个引用在堆中指向它自己: this的细节: 访问成员方法: 访问构造器:

精英ECS Z97-MACHINE V1.0 BIOS MX25L6406E

官网上的两个BIOS我都无法亮机,这是我保存出来的BIOS,不知道是否能使用五代的处理器 官网:Z97-MACHINE|Motherboard|产品|ECS 精英电脑 国外老哥的看法:ECS Z97-MACHINE Closer Look: The BIO…

RocketMQ-架构与设计

RocketMQ架构与设计 一、简介二、框架概述1.设计特点 三、架构图1.Producer2.Consumer3.NameServer4.BrokerServer 四、基本特性1.消息顺序性1.1 全局顺序1.2 分区顺序 2.消息回溯3.消息重投4.消息重试5.延迟队列(定时消息)6.重试队列7.死信队列8.消息语…

【电子书】游戏开发

资料 wx:1945423050 整理了一些互联网电子书,推荐给大家 游戏开发 ADOBE FLASH PROFESSIONAL CS6 标准培训教材.epubAndroid 3D 游戏案例开发大全.epubCocos Creator游戏开发实战.epubCocos2D-X游戏开发技术精解.epubCocos2d-JS游戏开发快速入门到实战…

《Python 语音转换简易速速上手小册》第3章 文本到语音的转换(2024 最新版)

文章目录 3.1 文本到语音的原理3.1.1 基础知识3.1.2 主要案例:自动新闻播报器案例介绍案例 Demo案例分析 3.1.3 扩展案例 1:智能助手案例介绍案例 Demo案例分析 3.1.4 扩展案例 2:电子书阅读器案例介绍案例 Demo案例分析 3.2 Python 中的文本…

python 验证AES_ECB算法对数据的加解密

目录 一、python 代码实现如下: 二、代码解析 三、运行结果 一、python 代码实现如下: #AES_ECB模式实现 from Crypto.Cipher import AES from Crypto.Random import get_random_bytes # 自动生成密钥 from Crypto.Util.Padding import pad, unpad …

开开开开开,干

大家新年快乐,开工啦啦啦啦 其实每天很多人都会问: 有协同过滤的算法吗,有的,可以给你解释原理… 有的小伙伴只开了一部分逻辑,我要实现用户可以下单功能 但是细细考虑下单,需要现有用户,维护…

为全志D1开发板移植LVGL日历控件和显示天气

利用TCP封装HTTP包请求天气信息 Linux还真是逐步熟悉中,现在才了解到Linux即没有原生的GUI,也没有应用层协议栈,所以要实现HTTP应用,必须利用TCP然后自己封装HTTP数据包。本篇即记录封装HTTP数据包,到心知天气请求天气…

Flutter Slider自定义滑块样式 Slider的label标签框常显示

1、自定义Slider滑块样式 Flutter Slider控件的滑块系统样式是一个圆点,thumbShape默认样式是RoundSliderThumbShape,如果想要使用其它的样式就需要自定义一下thumbShape; 例如需要一个上图样式的(圆点半透明圆形边框&#xff09…

2024年天津高考数学备考:历年选择题真题练一练(2014~2023)

距离2024年高考还有不到四个月的时间,今天我们来看一下2014~2023年的天津市高考数学的选择题,从过去十年的真题中随机抽取5道题,并且提供解析。后附六分成长独家制作的在线练习集,科学、高效地反复刷这些真题,吃透真题…

ELK入门(四)-logstash

Logstash Logstash 是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的存储库中。 Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中…