提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、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)