目录:
1、printSchema()
2、select()
3、filter()
4、groupBy()
5、sort()
一、概述
Spark Core所使用的的数据抽象是RDD(弹性分布式数据集);
Spark SQL所使用的的数据抽象是DataFrame(带有Schema信息的RDD);
•RDD是分布式的 Java对象的集合,但是,对象内部结构对于RDD而言却是不可知的。
•DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息。
(只不过RDD就像一个空旷的屋子,你要找东西要把这个屋子翻遍才能找到。那我们的这个DataFrame相当于在你的屋子里面打上了货架。那你只要告诉他你是在第几个货架的第几个位置,那不就是二维表吗。那就是我们DataFrame就是在RDD基础上加入了列。实际上我们处理数据就像处理二维表一样。)
二、创建
•Spark使用SparkSession接口替代SQLContext及HiveContext接口来实现其对数据加载、转换、处理等功能。SparkSession实现了SQLContext及HiveContext所有功能。
•SparkSession支持从不同的数据源加载数据,并把数据转换成DataFrame,并且支持把DataFrame转换成SQLContext自身中的表,然后使用SQL语句来操作数据。
可以通过如下语句创建一个SparkSession对象:

•在创建DataFrame之前,为了支持RDD转换为DataFrame及后续的SQL操作,需要导入相应的包(import spark.implicits._),启用隐式转换。
隐式转换介绍:
(1)、包括隐式参数、隐式对象、隐式类
(2)、scala独有的。
(3)、当调用对象中不存在的方法,系统会扫描上下文和伴对象看是否有implicit方法,如果有隐式方法则调用隐式方法,隐式 方法传入原生对象返回包含扩展方法的对象。
(4)、原类型和伴生对象都找不到的隐式值,会找手动导入的implicit。
•在创建DataFrame时,使用spark.read操作,从不同类型的文件中加载数据创建DataFrame。
——spark.read.json("/······/people.json"):读取people.json文件创建DataFrame;
(另一种写法:spark.read.format("json").load("/······/people.json"))
——spark.read.parquet("/······/people.parquet"):读取people.parquet文件创建DataFrame;
(另一种写法:spark.read.format("parquet").load("/······/people.parquet"))
——spark.read.csv("people.csv"):读取people.csv文件创建DataFrame。
(另一种写法:spark.read.format("csv").load("/······/people.csv"))
注意:从文本文件中读取数据创建DataFrame,无法直接使用上述类似的方法,需要从“从RDD转换得到DataFrame”。
实例:在“/usr/local/spark/examples/src/main/resources/”这个目录下,有个Spark安装时自带的样例数据数据people.json。
people.json文件的内容:

三、保存
可以使用spark.write操作,把一个DataFrame保存成不同格式的文件。
例如,把一个名称为df的DataFrame保存到不同格式文件中,方法如下:
——df.write.json("/······/people.json“):把DataFrame保存到“peoplr.json”文件
(另一种写法:df.write.format("json").save("/······/people.json"))
——df.write.parquet("/······/people.parquet“):把DataFrame保存到“people.parquet”文件
(另一种写法:df.write.format("parquet").save("/······/people.parquet"))
——df.write.csv("/······/people.csv"):把DataFrame保存到“people.csv”文件
(另一种写法:df.write.format("csv").save("/······/people.csv"))
例如:从文件people.json中创建一个DataFrame,然后保存成csv格式文件。

其中,df.select("name","age").writer语句的功能是从df中选择name和age两个这两个列的数据进行保存。如果保存所有的列,使用df.writer语句即可。生成的newpeople.csv是一个目录(目录中包含两个文件),如下:

四、常用操作
常用操作包括:printSchema()、select()、filter()、groupBy()和sort()等。

1、printSchema()
打印出DataFrame的模式(Schema)信息。

2、select()
select()操作功能是:从DataFrame中选取部分列的数据;实现对列名称进行重命名。
如图:①、从名为df的DataFrame中选取name和age这两个列,并把age这个列的值加1

②、将name列名称重命名为username。

3、filter()
实现条件查询,找到满足条件要求的记录。
如图:查询所有age字段大于20的记录

4、groupBy()
用于对记录进行分组。
如图:根据age字段进行分组,并对每个分组中包含的记录数量进行统计。

5、sort()
用于对记录进行排序。
如图:①、根据age字段进行降序排列

②、根据age字段进行降序排列,当age字段相同时,再根据name字段进行升序排列

其中,desc表示降序,asc表示升序。
本文介绍了DataFrame在Spark SQL中的重要性,它作为一种带有Schema信息的RDD,提供了比RDD更丰富的结构信息。文章详细讲解了如何创建DataFrame,包括通过SparkSession接口从不同数据源加载数据,以及隐式转换的概念。此外,还涵盖了DataFrame的保存方法,将其转化为不同格式的文件。最后,文章列举了DataFrame的常用操作,如printSchema、select、filter、groupBy和sort,展示了如何在DataFrame上进行数据处理和查询。

2020

被折叠的 条评论
为什么被折叠?



