DataFrame与Dataset基础

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、DataFrame简介

Spark SQL使用的数据抽象并非是RDD,而是DataFrame。在spark中,DataFrame是一种以RDD为基础的分布式数据集,可以与RDD相互转换。DataFrame的结构类似与传统数据库的二维表格,并且可以从很多数据源中创建,如结构化文件、外部数据库、hive表等数据源。

二、DataFrame的创建

1、启动Spark-Shell命令

创建SparkSession对象可以通过SparkSession.builder().getOrCreate()方法获取,但使用Spark-shell时,会默认提供一个名为sc的SparkContext对象和一个名为spark的SaprkSession
代码如下(示例):

spark-shell --master local[2]

在启动SparkShell后,效果如图所示
在这里插入图片描述
SparkContext、SparkSession对象已经创建完成。创建DataFrame有多种方式,最基本的方式是从一个已经存在的RDD调用toDF()方法转换,或读取数据源直接创建。

2.数据准备 person.txt

1 zhangsan 20
2 lisi 29
3 wangwu 25
4 zhaoliu 30
5 tianqi 35
6 jerry 40
代码如下(示例):

首先将数据上传到hdfs上

hadoop fs -mkdir /spark
hadoop fs -put /root/export/data/person.txt /spark      
    

3.通过文件直接创建DataFrame

通过spark读取数据源创建DataFrame

代码如下(示例):

//读取数据源
val personDF=spark.read.text("/spark/person.txt")
//打印元数据
personDF.printSchema()
//查看当前结果
personDF.show

4.RDD转换DataFrame

调用RDD的toDF()方法,可以将RDD转换为DataFrame对象。

具体代码如下(示例):

//读取并分割
val lineRDD=sc.textFile("/spark/person.txt").map(_.split(" "))
//样例类
case class Person(id:Int,name:String,age:Int)
//将字符串转换为整数
val personRDD=lineRDD.map(x=>Person(x(0).toInt,x(1),x(2).toInt))
//RDD转换为DataFrame
val personDF=personRDD.toDF()
//展示
personDF.show()
personDF.printSchema


5.DataFrame常用操作

DSL风格语法(函数),SQL风格语法

DSL风格
具体代码如下(示例):

//查看name字段数据
personDF.select(personDF("name")).show()
//select操作的重命名
personDF.select(personDF("name")as("username"),personDF("age")).show()
//filter()过滤年龄大于等于25的数据
personDF.filter(personDF("age")>=25).show
//groupBy()按年龄分组并统计个数
personDF.groupBy("age").count().show
//sort()按年龄降序
personDF.sort(personDF("age").desc).show


SQL风格
具体代码如下(示例):

//前提必须注册临时表
personDF.registerTempTable("t_person")
//查询年龄最大的两个人信息
 spark.sql("select * from t_person  order by age desc limit 2").show
 //查询年龄大于25的信息
 spark.sql("select * from t_person where age > 25").show
 

三、Dataset简介

Dataset从1.6版本引入的一个新的数据抽象结构。Dataset提供了特定域对象的强类型集合,也就是在RDD的每行数据中添加了类型约束条件,只有满足约束条件才能正常运行。Dataset结合了RDD和DataFrame的优点,并且可以点用封装的方法一并行的方式转换等操作。

四、Dataset对象的创建

1、数据源读取

具体代码如下(示例):

具体代码如下(示例):
```c
val personDS=spark.createDataset(sc.textFile("/spark/person.txt"))
 

2、方法转换

Dataset不仅能从RDD中构建,它与DataFrame也可可以相互转换,通过as()方法和toDF()方法
具体代码如下(示例):

spark.read.text("/spark/person.txt").as[String]

spark.read.text("/spark/person.txt").as[String].toDF()

# 总结
联系
a.RDD、DataFrame、DataSet都是分布式的弹性数据集,是对处理的数据的一种抽象。
b.都有 惰性机制,在 转化操作 时,不会立即执行,只有在遇到 行动操作 时才会开始计算。
c.都会根据Spark内存情况自动缓存运算,即使数据量很大也不用担心内存溢出问题。
d.都有partition分区的概念。
e.有许多共同的函数,例如filter、map等。
f.RDD适用于迭代计算和数据这一类的操作,处理结构化的数据一般用DataFrame和DataSet。

![在这里插入图片描述](https://img-blog.csdnimg.cn/168cac3c0d454ef281fa3fa63dc509a4.png)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沧州精神卫生中心张医师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值