大数据——SparkSQL学习笔记

Spark

一、SparkSQL简介

​ Spark用来处理结构化数据的一个模块,它提供了两个编程抽象分别叫做DataFrame和DataSet,它们用于作为分布式SQL查询引擎(类似于Hive,为便于进行MapReduce操作而使用类SQL语句进行Spark操作)。

数据兼容方面 SparkSQL 不但兼容 Hive,还可以从 RDD、parquet 文件、JSON 文件中获取数据,未来版本甚至支持获取 RDBMS 数据以及 cassandra 等 NOSQL 数据;

性能优化方面 除了采取 In-Memory Columnar Storage、byte-code generation 等优化技术 外、将会引进 Cost Model 对查询进行动态评估、获取最佳物理计划等等;

组件扩展方面 无论是 SQL 的语法解析器、分析器还是优化器都可以重新定义,进行扩 展。

——DataFrame
在这里插入图片描述

​ 在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。——DataSet

​ Spark提供的新抽象,它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter 等等)。

二、DataFrame

​ Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时表或者 生成 SQL 表达式。DataFrame API 既有 transformation 操作也有 action 操作。

基础SQL语法作用
var df = spark.read().<可选:json(“path”)…> 或spark.read().format(“”).option(“”).load()读取数据(默认读取数据源为Parquet格式)
df.createOrReplaceTempView(“表名”)根据数据建立临时视图
spark.sql(“SQL语句”).show查询并展示
df.write.format(“<可选:json…>”) .save(“路径”)保存数据

——JSON文件

​ Spark SQL 能够自动推测 JSON 数据集的结构,并将它加载为一个 Dataset[Row]. 可以 通过 SparkSession.read.json()去加载 JSON 文件。 注意:Spark 读取的 JSON 文件不是传统的 JSON 文件,每一行都应该是一个 JSON 串。

——CSV文件

​ Spark SQL 可以配置 CSV 文件的列表信息,读取 CSV 文件,CSV 文件的第一行设置为 数据列。

——MySql文件

​ Spark SQL 可以通过 JDBC 从关系型数据库中读取数据的方式创建 DataFrame,通过对 DataFrame 一系列的计算后,还可以将数据再写回关系型数据库中。

val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("SparkSQL")
//创建 SparkSession 对象
val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()
import spark.implicits._
//方式 1:通用的 load 方法读取
spark.read.format("jdbc").option("url", "jdbc:mysql://linux1:3306/spark-sql").option("driver", "com.mysql.jdbc.Driver").option("user", "root").option("password", "123123").option("dbtable", "user").load().show
//释放资源
spark.stop()
/** 导出数据 */
case class User2(name: String, age: Long)
val rdd: RDD[User2] = spark.sparkContext.makeRDD(List(User2("lisi", 20), User2("zs", 30)))
val ds: Dataset[User2] = rdd.toDS
//方式 1:通用的方式 format 指定写出类型
ds.write.format("jdbc").option("url", "jdbc:mysql://linux1:3306/spark-sql").option("user", "root").option("password", "123123").option("dbtable", "user").mode(SaveMode.Append).save()
//释放资源
spark.stop()

​ DataFrame提供一种特定领域语言(domain-specific language,DSL)去管理结构化数据。从而不必再建立临时视图。

基础DSL语法作用
df.rdd() rdd.toDF()RDD与DataFrame互相转化
ds.rdd() rdd.toDS()RDD与DataSet互相转化
ds.toDF() df.as(“类名”)DataSet与DataFrame互相转化
df.printSchema查看DataFrame信息
df.select(“属性名”).show查询并展示
df.filter.($“属性名” = 条件).show条件过滤
df.groupby(“属性名”).count.show分组并计次

三、DataSet

​ DataSet是具有强类型的数据集合(DataFrame只有基础数据类型,没有自定义数据类型),需要提供相应的类型信息。

基础语法作用
case class Person(name: String, age: Long)建立类
val caseClassDS = Seq(Person(“zhangsan”,2)).toDS()使用样例类序列建立DataSet
caseClassDS.show查看DataSet
在这里插入图片描述

——用户自定义函数(UDF)

sparksession.udf.register("prefixName", (name:String)=> {	//实现name前加字符"Name:" + name 
})
sparksession.sql("select age, prefixName(username) from user").show

——用户自定义聚合函数(UDAF)

​ 强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数, 如 count(), countDistinct(),avg(),max(),min()。除此之外,用户可以设定自己的自定义聚合函数。通过继承 UserDefinedAggregateFunction 来实现用户自定义弱类型聚合函数。从 Spark3.0 版本后,UserDefinedAggregateFunction 已经不推荐使用了。可以统一采用强类型聚合函数 Aggregator。

// TODO 创建 UDAF 函数
val udaf = new MyAvgAgeUDAF
// TODO 注册到 SparkSQL 中
spark.udf.register("avgAge", functions.udaf(udaf))
// TODO 在 SQL 中使用聚合函数
// 定义用户的自定义聚合函数
spark.sql("select avgAge(age) from user").show
// **************************************************
case class Buff( var sum:Long, var cnt:Long )
// totalage, count
class MyAvgAgeUDAF extends Aggregator[Long, Buff, Double]{override def zero: Buff = Buff(0,0)//聚合override def reduce(b: Buff, a: Long): Buff = {b.sum += ab.cnt += 1b}//合并多个缓冲区override def merge(b1: Buff, b2: Buff): Buff = {b1.sum += b2.sumb1.cnt += b2.cntb1}//结果输出override def finish(reduction: Buff): Double = {reduction.sum.toDouble/reduction.cnt}override def bufferEncoder: Encoder[Buff] = Encoders.productoverride def outputEncoder: Encoder[Double] = Encoders.scalaDouble
}

四、SparkSQL连接Hive

打开外部已经配置完成的Hive

➢ Spark 要接管 Hive 需要把 hive-site.xml 拷贝到 conf/目录下

➢ 把 Mysql 的驱动 copy 到 jars/目录下

➢ 如果访问不到 hdfs,则需要把 core-site.xml 和 hdfs-site.xml 拷贝到 conf/目录下

➢ 重启 spark-shell

使用IDEA实现SparkSQL连接Hive

➢ 导入jar包

<dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.12</artifactId><version>3.0.0</version>
</dependency>
<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>1.2.1</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.27</version>
</dependency>

➢ 将hive-site.xml 拷贝到resources(classpath)目录下

具体代码可以参考:
https://github.com/Ostrich5yw/java4BigData

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

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

相关文章

windows phone7资料整理

wp7资料库 http://msdn.microsoft.com/zh-cn/magazine/gg598932.aspx 开发指导视频&#xff1a; http://channel9.msdn.com/Series/Windows-Phone-7-Development-for-Absolute-Beginners 指导博客&#xff1a; http://www.jeffblankenburg.com/2010/09/30/31-days-of-windows-p…

远程连接 SuSE Linux 设置方法

作者&#xff1a;Flyingis 且不说远程连接的便利性&#xff0c;就是机房里那轰轰的高分贝就足以让你的耳膜形成习惯性振动&#xff0c;何况还需要集中精神工作呢&#xff0c;在网络带宽允许的情况下&#xff0c;还是选择远程吧。远程连接的客户端工具有很多&#xff0c;有商…

android获取控件宽度高度

前几天&#xff0c;在自定义控件的时候碰到个问题&#xff0c;就是在如何获取自定义控件的高宽。在自定义控件类的构造函数中&#xff0c;本来以为可以轻松获取&#xff0c;但事实不是这样。我测试了下面代码&#xff1a; 先是布局代码&#xff1a; <com.lml.getvalues.MyVi…

浅谈Java网络编程之Socket (1)

和大家一起分享的是Java网络编程之Socket。在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象&#xff0c;这个对象有两个关键的方法&#xff0c;一个是getInputStream方法&#xff0c;另一个是getOutputStream方法。getInputStream方法可以得到一个输入流&#xff…

Windows10系统Python2.7通过Swig调用C++过程

我用的 python版本是2.7.12&#xff1a; Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 1, 下载Swig 下载地址&#xff1a;http://www.swig.org/download.html&#xff0c;我下载了最新版本swigwin-4.0.0. 下载后直接解压…

《当程序员的那些狗日日子》(六十一)美丽的天际

《当程序员的那些狗日日子》&#xff08;六十一&#xff09;美丽的天际 注&#xff1a;这一篇之后&#xff0c;全文完结&#xff0c;后面还会再写一篇《后记》&#xff0c;以记录我在写作中的一些心情和感受&#xff0c;以及我想对各位支持和关注的朋友说的话。 我交了订金订购…

ewebeditor遍历路径漏洞

ewebeditor/admin_uploadfile.asp?id14在id14后面添加&dir..再加 &dir../..&dirhttp://www.cnblogs.com/../.. 看到整个网站文件了 转载于:https://www.cnblogs.com/allyesno/archive/2007/11/04/949171.html

Windows系统Python直接调用C++ DLL

环境&#xff1a;Window 10&#xff0c;VS 2019&#xff0c; Python 2.7.12, 64bit 1&#xff0c;打开 VS 2019&#xff0c;新建C Windows 动态链接库工程 Example&#xff0c;加入下列文件&#xff0c;如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 D…

用SD卡下载uboot、linux内核和文件系统

1、 移植mtd-utils: a) 下载utd-utils 下载地址为ftp://ftp.infradead.org/pub/mtd-utils/b) 交叉编译mtd-utilsi 修改Makefile CROSSarm-linux-ii makeiii 查看下mtd-utils-1.0.0目录下是否生成了咱们所需要大工具 (flashcp,nandwrite......等)。有工具生成了&#xf…

进行有效编辑的七种习惯

如果你的很多时间是用来敲纯文本&#xff0c;写程序或HTML&#xff0c;那么有效地使用一个好的编辑器能节省你不少时间。这篇文章里的指导和提示将有助于你更快工作&#xff0c;更少犯错误。 文中采用开源文本编辑器Vim(Vi IMproved)说明有效编辑的思想&#xff0c;但这些思想也…

最全的HTML特殊字符集

有些属于utf-8字符集&#xff0c;所以网页需要字符编码是utf-8才能显示全部字符。下面是来自不同的源&#xff0c;所以难免有重复的地方。 left single quote &lsquo;‘right single quote &rsquo;’single low-9 quote &sbquo;‚left double quote &ldquo;“r…

Desktop OS Market Share: Windows 90% - Mac 9% - Linux 1%

http://blog.tangcs.com/2008/12/14/desktop-os-market-share-2008/转载于:https://www.cnblogs.com/WarrenTang/archive/2008/12/14/1354704.html

css3中变形与动画(三)

transform可以实现矩阵变换&#xff0c;transition实现属性的平滑过渡&#xff0c;animation意思是动画&#xff0c;动漫&#xff0c;这个属性才和真正意义的一帧一帧的动画相关。本文就介绍animation属性。 animation属性通过一些关键帧中元素属性的改变来实现动画效果。当然也…

Lock“锁定”语句(C# 参考)

lock 关键字将语句块标记为临界区&#xff0c;方法是获取给定对象的互斥锁&#xff0c;执行语句&#xff0c;然后释放该锁。此语句的形式如下&#xff1a; 以带有颜色区分的格式查看复制到剪贴板打印Object thisLock new Object(); lock (thisLock) {// Critical code section…

个人代码库の自定义后缀名

usingMicrosoft.Win32; //操纵注册表的必要命名空间。namespacemyMethod{publicclassCreateSuffixName {//使程序获取被双击了的文件的路径,用到[Command]函数&#xff0c;可以[获取路径].///<summary>///创建自定义后缀名的方法。///</summary>///<param name&…

漂浮效果

<!doctype html> <html> <head> <title>漂浮效果</title> </head> <body> <div style"position:absolute;" onMouseOver"window.clearInterval(timer)" onMouseOut"creatTimer()"><img src&…

Scott Mitchell 的ASP.NET 2.0数据教程之四十四::DataList和Repeater数据分页

原文 | 下载本教程中的编码例子 | 下载本教程的PDF版 导言 分页和排序是显示数据时经常用到的功能。比如&#xff0c;在一个在线书店里搜索关于ASP.NET 的书的时候&#xff0c;可能结果会是成百上千&#xff0c;而每页只列出十条。而且结果可以根据title&#xff08;书名&#…

Python中的高级数据结构

http://blog.jobbole.com/65218/ 本文由 伯乐在线 - 熊崽Kevin 翻译自 pypix.com。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。 数据结构 数据结构的概念很好理解&#xff0c;就是用来将数据组织在一起的结构。换句话说&#xff0c;数据结构是用来存储一系列关联数据的…

rails3系统架构

http://seamon.iteye.com/blog/1058510转载于:https://www.cnblogs.com/orez88/articles/2276821.html

如何理解 Objective-C Delegate

例如&#xff0c;我们要在一个 ViewController 中使用一个ActionSheet&#xff0c;代码如下&#xff1a; UIActionSheet *actionSheet [[UIActionSheet alloc]initWithTitle:"Delegate Example"delegate:self // telling this class to implement UIActionSheetDele…