目录
一、数据帧 - DataFrame
(一)DataFrame概述
DataFrame是Spark SQL提供的一个编程抽象,与RDD类似,也是一个分布式的数据集合,但与RDD不同,DataFrame的数据都被组织到有名字的列中,就像关系型数据库中的表一样。此外,多种数据都可以转化为DataFrame,例如Spark计算过程中生成的RDD、结构化数据文件、Hive中的表、外部数据库等。
(二)将RDD转成DataFrame
DataFrame在RDD的基础上添加了数据描述信息(Schema,即元信息),因此看起来更像是一张数据库表。
使用DataFrame API结合SQL处理结构化数据比RDD更加容易,而且通过DataFrame API或SQL处理数据,Spark优化器会自动对其优化,即使写的程序或SQL不高效,也可以运行得很快。
二、数据集 - Dataset
(一)Dataset概述
Dataset是一个分布式数据集,是Spark 1.6中添加的一个新的API。相对于RDD,Dataset提供了强类型支持,在RDD的每行数据加了类型约束。而且使用Dataset API同样会经过Spark SQL优化器的优化,从而提高程序执行效率。
(二)DataFrame与Dataset的关系
在Spark中,一个DataFrame
所代表的是一个元素类型为Row
的Dataset
,即DataFrame
只是Dataset[Row]
的一个类型别名。
三、简单使用Spark SQL
(一)了解SparkSession
- Spark Shell启动时除了默认创建一个名为sc的SparkContext的实例外,还创建了一个名为spark的SparkSession实例,该spark变量可以在Spark Shell中直接使用。
- 从Spark2.0以上版本开始, Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载、转换、处理等功能。SparkSession实现了SQLContext及HiveContext所有功能。
- SparkSession只是在SparkContext基础上的封装,应用程序的入口仍然是SparkContext。SparkSession允许用户通过它调用DataFrame和Dataset相关API来编写Spark程序,支持从不同的数据源加载数据,并把数据转换成DataFrame,然后使用SQL语句来操作DataFrame数据。
(二)准备数据文件
创建student.txt
文件
vim student.txt
注意:文件中不能包含空行,否则后续会报错
1,郑秀芸,女,20
2,王志峰,男,18
3,陈燕文,女,21
4,郑国栋,男,19
5,肖雨涵,男,20
将
student.txt
上传到HDFS的/input
目录
(三)加载数据为Dataset
启动Spark Shell:
spark-shell --master spark://master:7077
1、读取文本文件,返回数据集
调用SparkSession对象的read.textFile()
可以读取指定路径中的文件内容,并加载为一个Dataset
val ds = spark.read.textFile("hdfs://master:9000/input/student.txt")
- 除了使用
textFile()
方法读取文本内容外,还可以使用csv()
、jdbc()
、json()
等方法读取CSV
文件、JDBC
数据源、JSON
文件等数据。