【spark】spark SQL概述 RDD、DataFrame及DataSet开发 相互转换 以及sparksql和mysql数据转换

本文深入介绍了Spark SQL,包括其四大特性:SQL与Spark程序混合、统一数据访问、Hive SQL兼容和JDBC/ODBC支持。详细探讨了DataFrame与RDD的区别和优缺点,并展示了如何从RDD转换为DataFrame。此外,文章还涵盖了DataFrame的创建、操作及与JSON文件的交互。最后,阐述了如何使用Spark SQL从MySQL加载和写入数据。
摘要由CSDN通过智能技术生成

一、sparksql概述

Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用。

相比于Spark RDD API,Spark SQL包含了对结构化数据和在其上运算的更多信息,Spark SQL使用这些信息进行了额外的优化,使对结构化数据的操作更加高效和方便

Hive,是将Hive SQL转换成MapReduce然后提交到集群中去执行,大大简化了编写MapReduce程序的复杂性,由于MapReduce这种计算模型执行效率比较慢,所以Spark SQL应运而生,它是将Spark SQL转换成RDD,然后提交到集群中去运行,执行效率非常快!

二、sparksql四大特性
  • 易整合
    • 将sql查询与spark程序无缝混合,可以使用java、scala、python、R等语言的API操作
  • 统一的数据源访问
    • sparksql以相同方式访问任意数据源
    • SparkSession.read.文件格式方法(对应文件格式的路径)
  • 兼容hive
    • 支持hivesql的语法
  • 标准的数据连接
    • 可以使用行业的jdbc和odbc来连接数据库

三、DataFrame简介

在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库的二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型,但底层做了更多的优化.

DataFrame与RDD的区别
  1. rdd里面存放的是java对象,dataframe来说它里面存放的是Row对象,Row也就是说把每一行数据封装在一个Row对象

  2. dataframe中除了数据之外,还包括了数据结构信息,这个结构信息,我们叫做schema(比如当前它有哪些列名称和列的类型)

  3. DataFrame还引入了off-heap,意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。

在这里插入图片描述

DataFrame与RDD的优缺点

1、rdd优缺点

  • 优点
    1、编译时类型安全
    2、面向对象编程的风格
  • 缺点
    1、序列化和反序列化性能开销很多
    2、GC性能开销:频繁的创建对象和销毁,会带来大量的GC

2、dataFrame的优缺点
dataFrame它引入schema和off-heap(使用不在jvm堆以内的内存,直接使用操作系统中的内存)

  • 优点
    1. 引入了schema解决了rdd的这个缺点(序列化和反序列化性能开销很多)
    2. 引入了off-heap解决了rdd的这个缺点(GC性能开销很大)
  • 缺点
    • 丢失了RDD的优点
    • 不在是编译时类型安全
    • 也不是面向对象编程风格
读取数据源创建DataFrame

读取文本文件创建DataFrame
在这里插入图片描述

(1)在本地创建一个文件,有三列,分别是id、name、age,用空格分隔,然后上传到hdfs上。person.txt内容为:

1 zhangsan 20
2 lisi 29
3 wangwu 25
4 zhaoliu 30
5 tianqi 35
6 kobe 40

上传数据文件到HDFS上:

hdfs dfs -put person.txt  /

(2)在spark shell执行下面命令,读取数据,将每一行的数据使用列分隔符分割
先执行 spark-shell --master local[2]

val lineRDD= sc.textFile("/person.txt").map(_.split(" "))

在这里插入图片描述

(3)定义case class(相当于表的schema)

case class Person(id:Int, name:String, age:Int)

在这里插入图片描述

(4)将RDD和case class关联

val personRDD = lineRDD.map(x => Person(x(0).toInt, x(1), x(2).toInt))

在这里插入图片描述

(5)将RDD转换成DataFrame

val personDF = personRDD.toDF

在这里插入图片描述

(6)对DataFrame进行处理

personDF.show

在这里插入图片描述

personDF.printSchema

在这里插入图片描述

(7)、通过SparkSession构建DataFrame
使用spark-shell中已经初始化好的SparkSession对象spark生成DataFrame

val dataFrame=spark.read.text("/person.txt")

在这里插入图片描述

读取json文件创建DataFrame

(1)数据文件
使用spark安装包下的
/opt/bigdata/spark/examples/src/main/resources/people.json文件

(2)在spark shell执行下面命令,读取数据

val jsonDF= spark.read.json("file:///opt/bigdata/spark/examples/src/main/resources/people.json")

在这里插入图片描述

(3)接下来就可以使用DataFrame的函数操作

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

四、DataFrame常用操作

DSL风格语法

DataFrame提供了一个领域特定语言(DSL)来操作结构化数据。

//创建rdd
val rdd1=sc.textFile("/person.txt").map(_.split(" "))
//定义样例类
case class Person(id:Int,name:String,age:Int)
//rdd于样例类关联
val rdd2=rdd1.map(x => Person(x(0).toInt,x(1),x(2).toInt))
//rdd转换成dataFrame
val personDF=rdd2.toDF 
//打印schema
personDF.printSchema
//查询数据
personDF.show
//查询name字段
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大于30的用户人数
personDF.filter($"age" >30).count
//按照age进行分组统计不同的age出现的人的次数
presonDF.groupBy("age").count.show
SQL风格语法

可以把DataFrame看成是一张关系型数据表

  1. 需要把dataFrame注册成一张表
 presonDF.registerTempTable("t_person")
  1. 通过SparkSession调用sql方法,传入对应sql语句
    spark.sql(sql语句)
spark.sql("select * from t_person").show
spark.sql("select * from t_person where id=1").show
spark.sql("select * from t_person order by age desc").show

六、DataSet

DataSet是分布式的数据集合,Dataset提供了强类型支持,也是在RDD的每行数据加了类型约束。DataSet是在Spark1.6中添加的新的接口。它集中了RDD的优点(强类型和可以用强大lambda函数)以及使用了Spark SQL优化的执行引擎.

DataFrame、DataSet、RDD的区别

假设RDD中的两行数据长这样:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值