2023_Spark_实验十四:SparkSQL入门操作

news2024/11/18 18:28:01

1、将emp.csv、dept.csv文件上传到分布式环境,再用 

hdfs  dfs -put dept.csv /input/

hdfs  dfs -put emp.csv /input/

将本地文件put到hdfs文件系统的input目录下

2、或者调用本地文件也可以。区别:sc.textFile("file:///D:\\temp\\emp.csv")


import org.apache.spark.sql.SparkSession

import org.apache.spark.sql.types._

import spark.implicits._



case classEmp(empno:Int,ename:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptno:Int)



val lines =sc.textFile("hdfs://Master:9000/input/emp.csv").map(_.split(","))



val allEmp = lines.map(x=>Emp(x(0).toInt,x(1),x(2),x(3),x(4),x(5).toInt,x(6),x(7).toInt))





val allEmpDF = allEmp.toDF



allEmpDF.show

  • StructType 是个case class,一般用于构建schema.

  • 因为是case class,所以使用的时候可以不用new关键字

构造函数

  • 可以传入Seq,List,Array,都是可以的~

  • 还可以用无参的构造器,因为它有一个无参的构造器.

例子

private val schema: StructType = StructType(List(

    StructField("name", DataTypes.StringType),

    StructField("age", DataTypes.IntegerType)

  ))

也可以是

private val schema: StructType = StructType(Array(

    StructField("name", DataTypes.StringType),

    StructField("age", DataTypes.IntegerType)

  ))

  • 还可以调用无参构造器,这么写

private val schema = (new StructType)

    .add(StructField("name", DataTypes.StringType))

    .add(StructField("age", DataTypes.IntegerType))

  • 这个无参的构造器,调用了一个有参构造器.this里面是个方法,这个方法的返回值是Array类型,实际上就是无参构造器调用了主构造器

def this() = this(Array.empty[StructField])

case class StructType(fields: Array[StructField]) extends DataType with Seq[StructField] {}

import org.apache.spark.sql.types._

val myschema =StructType(List(

StructField("empno",DataTypes.IntegerType),

StructField("ename",DataTypes.StringType),

StructField("job",DataTypes.StringType),

StructField("mgr",DataTypes.StringType),

StructField("hiredate",DataTypes.StringType),

StructField("sal",DataTypes.IntegerType),

StructField("comm",DataTypes.StringType),

StructField("deptno",DataTypes.IntegerType)

))



val empcsvRDD = sc.textFile("hdfs://Master:9000/input/emp.csv").map(_.split(","))

import org.apache.spark.sql.Row

val rowRDD=empcsvRDD.map(line => Row (line(0).toInt,line(1),line(2),line(3),line(4),line(5).toInt,line(6),line(7).toInt))



val df = spark.createDataFrame(rowRDD,myschema)

将people.json文件上传到分布式环境

hdfs  dfs -put people.json /input

hdfs  dfs -put emp.json /input

//读json文件

val df = spark.read.json("hdfs://Master:9000/input/emp.json")

df.show

df.select ("ename").show

df.select($"ename").show

df.select($"ename",$"sal",$"sal"+100).show

df.filter($"sal">2000).show

df.groupBy($"deptno").count.show

df.createOrReplaceTempView("emp")

spark.sql("select * from emp").show

spark.sql("select * from emp where deptno=10").show

spark.sql("select deptno,sum(sal) from emp group by deptno").show


//1 创建一个普通的 view 和一个全局的 view

df.createOrReplaceTempView("emp1")

df.createGlobalTempView("emp2")



//2 在当前会话中执行查询,均可查询出结果

spark.sql("select * from emp1").show

spark.sql("select * from global_temp.emp2").show



//3 开启一个新的会话,执行同样的查询



spark.newSession.sql("select * from emp1").show //运行出错

spark.newSession.sql("select * from global_temp.emp2").show

//7、创建 Datasets

//创建 DataSet,方式一:使用序列

//1、定义 case class

case class MyData(a:Int,b:String)



//2、生成序列,并创建 DataSet

val ds = Seq(MyData(1,"Tom"),MyData(2,"Mary")).toDS



//3、查看结果



ds.show



ds.collect


//创建 DataSet,方式二:使用 JSON 数据



//1、定义 case class

case class Person(name: String, gender: String)



//2、通过 JSON 数据生成 DataFrame



val df = spark.read.json(sc.parallelize("""{"gender": "Male", "name": "Tom"}""":: Nil))



//3、将 DataFrame 转成 DataSet



df.as[Person].show

df.as[Person].collect


//创建 DataSet,方式三:使用 HDFS 数据



val linesDS = spark.read.text("hdfs://Master:9000/input/word.txt").as[String]

val words = linesDS.flatMap(_.split(" ")).filter(_.length > 3)

words.show

words.collect


val result = linesDS.flatMap(_.split(" ")).map((_,1)).groupByKey(x => x._1).count

result.show

result.orderBy($"value").show

1、将emp.json文件上传到分布式环境,再用 

hdfs  dfs -put emp.json /input/

将本地文件put到hdfs文件系统的input目录下


//8、Datasets 的操作案例



//1.使用 emp.json 生成 DataFrame

val empDF = spark.read.json("hdfs://Master:9000/input/emp.json")

//查询工资大于 3000 的员工

empDF.where($"sal" >= 3000).show



//创建 case class

case classEmp(empno:Long,ename:String,job:String,hiredate:String,mgr:String,sal:Long,comm:String,deptno:Long)



//生成 DataSets,并查询数据



val empDS = empDF.as[Emp]

//查询工资大于 3000 的员工

empDS.filter(_.sal > 3000).show

//查看 10 号部门的员工

empDS.filter(_.deptno == 10).show





//多表查询



//1、创建部门表



val deptRDD=sc.textFile("hdfs://Master:9000/input/dept.csv").map(_.split(","))

case class Dept(deptno:Int,dname:String,loc:String)

val deptDS = deptRDD.map(x=>Dept(x(0).toInt,x(1),x(2))).toDS

//2、创建员工表



case classEmp(empno:Int,ename:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptno:Int)

val empRDD = sc.textFile("hdfs://Master:9000/input/emp.csv").map(_.split(","))

val empDS = empRDD.map(x =>Emp(x(0).toInt,x(1),x(2),x(3),x(4),x(5).toInt,x(6),x(7).toInt)).toDS



//3、执行多表查询:等值链接



val result = deptDS.join(empDS,"deptno")

//另一种写法:注意有三个等号

val result = deptDS.joinWith(empDS,deptDS("deptno")===empDS("deptno"))



//查看执行计划:

result.explain



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

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

相关文章

苹果10月24日推送iOS 17.1:修复iPhone 12辐射超标问题 信号会更差

前段时间在iPhone 15系列发布的当天,法国突然宣布iPhone 12不能在该国销售,理由是iPhone 12超过了当地无线电频率暴露的法定范围。 根据法国监管机构ANFR(国家频率管理局)发布的最新消息,苹果将会在10月24日推送iOS 17.1正式版,届…

Prometheus的Pushgateway快速部署及使用

prometheus-pushgateway安装 一. Pushgateway简介 Pushgateway为Prometheus整体监控方案的功能组件之一,并做于一个独立的工具存在。它主要用于Prometheus无法直接拿到监控指标的场景,如监控源位于防火墙之后,Prometheus无法穿透防火墙&…

自动驾驶:控制算法概述

自动驾驶:控制算法概述 常见控制算法PID算法LQR算法MPC算法 自动驾驶控制算法横向控制纵向控制 参考文献 常见控制算法 PID算法 PID(Proportional-Integral-Derivative)控制是一种经典的反馈控制算法,通常用于稳定性和响应速度要…

MATLAB-文件自动批量读取文件,并按文件名称或时间顺序进行数据处理

我在处理文件数据时,发现一个一个文件处理效率太低,因此学习了下MATLAB中自动读取特定路径下文件信息的程序,并根据读取信息使用循环进行数据处理,提高效率,在此分享给大家这段代码并给予一些说明,希望能为…

.Net Core 6 运行环境手动安装流程

安装.NET Core 6 概述 在开始之前,我们首先需要了解一下整个安装过程的流程。下面的表格将展示安装.NET Core 6的步骤以及每一步需要做的事情。 步骤 动作 说明 1 下载.NET Core 6 SDK 从官方网站下载.NET Core 6 SDK安装包 2 安装.NET Core 6 SDK …

AXURE RP EXTENSION For Chrome 安装

在浏览器上输入地址:chrome://extensions/ 打开图片中这个选项,至此你就能通过index.html访问

【设计模式-1】UML和设计原则

说明:设计模式(Design Pattern)对于软件开发,简单来说,就是软件开发的套路,固定模板。在学习设计模式之前,需要首先学习UML(Unified Modeling Language,统一建模语言&…

BAT026:删除当前目录及子目录下的空文件夹

引言:编写批处理程序,实现批量删除当前目录及子目录下的空文件夹。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【编辑…

MinIO (一)安装并生成windows服务

最近公司要搞文件服务器,所以就研究了下MinIO,在这里做个笔记,研究的不深,记录一下基本使用功能,用到了哪些功能就研究哪些,里面的很多功能没用到。 MinIO 文件在线管理系统 更多详细介绍请参考 官网&am…

微信小程序仿苹果负一屏由弱到强的高斯模糊

进入下面小程序可以体验效果&#xff0c;然后进入更多。查看模糊效果 一、创建小程序组件 二、代码 wxml: <view class"topBar-15"></view> <view class"topBar-14"></view> <view class"topBar-13"></view&…

4-k8s-部署springboot项目简单实践

文章目录 一、部署原理图二、部署实践 一、部署原理图 部门一般都有一个属于自己的私服gitlab服务器&#xff0c;由开发者开发代码&#xff0c;然后上传到私服gitlab然后使用调度工具&#xff0c;如jenkins&#xff0c;去gitlab拉去代码&#xff0c;编译打包&#xff0c;最后得…

Web3D虚拟人制作简明指南

如何在线创建虚拟人? 虚拟人,也称为数字化身、虚拟助理或虚拟代理,是一种可以通过各种在线平台与用户进行逼真交互的人工智能人。 在线创建虚拟人变得越来越流行,因为它为个人和企业带来了许多好处。 通过虚拟助理或代理,您可以以更具吸引力和个性化的方式与客户或受众进…

iOS 中,isa 指针

每个对象都有 isa 指针&#xff0c;指向对象所属的类。例如类 NSString 其实是类对象。 类对象产生于编译期&#xff0c;单例。 类对象有 isa 指针指向对应元类&#xff0c;元类&#xff08;metaclass&#xff09;中保存了创建类对象以及类方法所需的所有信息。 struct objc_…

根据脑图谱获取感兴趣区域的mask

根据脑图谱获取感兴趣区域的mask 1&#xff0c;引入1.1 ASPECT-Atlas 2&#xff0c;获取脑图谱感兴趣区域mask参考&#xff1a; 1&#xff0c;引入 脑影像分析中&#xff0c;我们常常会针对性的对某些感兴趣区域进行分析&#xff0c;而对它们进行分析的前提是获取该区域的mask…

网络社区挖掘-图论部分的基本知识笔记

1 网络社区挖掘定义 网络社区挖掘是指利用数据挖掘技术和机器学习算法&#xff0c;分析社交网络、在线社区或互联网上的各种交互数据&#xff0c;以揭示其中隐藏的模式、关系和信息。这些社区可以是社交媒体平台、在线论坛、博客、微博等&#xff0c;人们在这些平台上进行交流…

vueday01——动态参数

我们现在知道了 v-bind:的语法糖是: v-on:的语法糖是 我们现在来尝试一下&#xff0c;定义一个动态参数模拟点击事件按钮 <div :id"idValue" ref"myDiv">我是待测div{{ resultId }}</div> <button v-on:[eventName]"doSomething&…

wsl使用vscode连接,远程安装C/C++ 拓展时,报错

报错内容&#xff1a; EACCES: permission denied, rename /home/wen/.vscode-server/extensions/.b61b1c7c-f703-4dfd-bdc5-d9a00681c4b7 -> /home/wen/.vscode-server/extensions/ms-vscode.cpptools-1.17.5-linux-x64 解决办法&#xff1a; 升级wsl到wsl2就好了。 &a…

高质量床上用品类网站带手机端的pbootcms模板

模板介绍&#xff1a; 这是一个基于PbootCMS内核开发的床上用品类网站模板&#xff0c;专为床上用品、家用纺织类企业设计和开发。它不仅提供了网站界面简洁简单、易于管理的特点&#xff0c;还附带了测试数据&#xff0c;方便用户进行演示和学习。 模板特点&#xff1a; 采用…

vueday01——文本渲染与挂载

1.定义html样式字符串 const rawHtml "<span stylecolor:red>htmlTest</span>" 2.创建标签&#xff0c;分别渲染普通文本和html文本 <p> 你好<span v-html"rawHtml"></span></p> 3.代码展示 4.结果展示

Springboot视图解析与模板引擎~

视图解析&#xff1a; springboot默认不支持JSP&#xff0c;需要引入第三方模板引擎技术实现页面渲染 视图处理方式&#xff1a;转发&#xff0c;重定向&#xff0c;自定义视图 thymeleaf的使用&#xff1a; 1&#xff1a;引入starter <dependency><groupId>o…