DataFrame

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

目录

一、概述

二、创建

三、保存

四、常用操作

              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接口替代SQLContextHiveContext接口来实现其对数据加载、转换、处理等功能。SparkSession实现了SQLContextHiveContext所有功能。

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保存成不同格式的文件。

例如,把一个名称为dfDataFrame保存到不同格式文件中,方法如下:

——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表示升序。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值