目录
已存在的RDD调用toDF()方法转换得到DataFrame。
printSchema(),打印出DataFrame 的模式(Schema)信息
1、通过SparkSession中的createDataset来创建Dataset
2、DataFrame通过“as[ElementType]”方法转换得到Dataset
一、Spark SQL基本概念
Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象结构叫做DataFrame的数据模型(即带有Schema信息的RDD),Spark SQL作为分布式SQL查询引擎,让用户可以通过SQL、DataFrames API和Datasets API三种方式实现对结构化数据的处理。
二、DataFrame
创建DataFrame的两种基本方式:
-
已存在的RDD调用toDF()方法转换得到DataFrame。
案例:
-
通过Spark读取数据源直接创建DataFrame。
若使用SparkSession方式创建DataFrame,可以使用spark.read从不同类型的文件中加载数据创建DataFrame。spark.read的具体操作,在创建Dataframe之前,为了支持RDD转换成Dataframe及后续的SQL操作,需要导入import.spark.implicits._包启用隐式转换。若使用SparkSession方式创建Dataframe,可以使用spark.read操作,从不同类型的文件中加载数据创建DataFrame,
具体操作API:
案例:
DataFrame的常用操作
spark作为分布式计算框架,在工业界占据了比较主流的地位。spark同样也提供了DataFrame供用户使用。
以下将介绍DataFrame的一些常用操作
案例:
主程序json和代码:
{"name": "nian"}
{"name": "li","age": 34}
{"name": "qian","age": 24}
scala> import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SparkSession
scala> val spark = SparkSession.builder().appName("parquet").master("local[*]").getOrCreate()
var df_testjson = spark.emptyDataFrame
# 读取json文件
scala> df_testjson = spark.read.json(s"/Users/test.json")
-
show() 显示信息
scala> df_testjson.show()
+----+----+
| age|name|
+----+----+
|null|nian|
| 34| li|
| 24|qian|
+----+----+
-
printSchema(),打印出DataFrame 的模式(Schema)信息
scala> df_testjson.printSchema()
root
|-- age: long (nullable = true)
|-- name: string (nullable = true)
-
select(),选择部分列信息
scala> df_testjson.select("name").show()
+----+
|name|
+----+
|nian|
| li|
|qian|
scala> df_testjson.select(df_testjson("name").as("username")).show()
+--------+
|username|
+--------+
| nian|
| li|
| qian|
+--------+
-
filter :条件查询
scala> df_testjson.filter("age > 24").show()
+---+----+
|age|name|
+---+----+
| 34| li|
+---+----+
-
groupBy : 分组
scala> df_testjson.groupBy("age").count().show()
+----+-----+
| age|count|
+----+-----+
| 34| 1|
|null| 1|
| 24| 1|
+----+-----+
-
orderBy :排序,默认升序,desc降序
scala> df_testjson.orderBy("age").show()
+----+----+
| age|name|
+----+----+
|null|nian|
| 24|qian|
| 34| li|
+----+----+
三、RDD、DataFrame及Dataset的区别
- RDD数据的表现形式,即序号(1),此时RDD数据没有数据类型和元数据信息。
- DataFrame数据的表现形式,即序号(2),此时DataFrame数据中添加Schema元数据信息(列名和数据类型,如ID:String),DataFrame每行类型固定为Row类型,每列的值无法直接访问,只有通过解析才能获取各个字段的值。
- Dataset数据的表现形式,序号(3)和(4),其中序号(3)是在RDD每行数据的基础之上,添加一个数据类型(value:String)作为Schema元数据信息。而序号(4)每行数据添加People强数据类型,在Dataset[Person]中里存放了3个字段和属性,Dataset每行数据类型可自定义,一旦定义后,就具有错误检查机制。
Dataset对象的创建
1、通过SparkSession中的createDataset来创建Dataset
2、DataFrame通过“as[ElementType]”方法转换得到Dataset
四、RDD转换DataFrame
Spark官方提供了两种方法实现从RDD转换得到DataFrame。
-
利用反射机制来推断包含特定类型对象的Schema
- 创建Maven工程。打开IDEA开发工具,创建名为“spark_chapter04”的Maven工程。
- 添加依赖。在pom.xml文件中添加Spark SQL依赖。
- 定义case class样例类、字段和属性,样例类的参数名会被利用反射机制作为列名。通过sc对象读取文件生成一个RDD,将RDD 与样例类匹配,调用toDF()方法将RDD转换为DataFrame。
-
通过编程接口构造一个Schema
- 创建一个Row对象结构的RDD。
- 基于StructType类型创建Schema。
- 通过SparkSession提供的createDataFrame()方法来拼接Schema,来实现RDD转换成DataFrame。