Spark SQL的总结

目录

一、Spark SQL基本概念

二、DataFrame 

创建DataFrame的两种基本方式:

已存在的RDD调用toDF()方法转换得到DataFrame。

案例: 

通过Spark读取数据源直接创建DataFrame。

案例:

 DataFrame的常用操作

案例:

show() 显示信息

printSchema(),打印出DataFrame 的模式(Schema)信息

select(),选择部分列信息

filter :条件查询

groupBy : 分组

orderBy :排序,默认升序,desc降序

 三、RDD、DataFrame及Dataset的区别

Dataset对象的创建

1、通过SparkSession中的createDataset来创建Dataset

2、DataFrame通过“as[ElementType]”方法转换得到Dataset

四、RDD转换DataFrame

利用反射机制来推断包含特定类型对象的Schema

通过编程接口构造一个Schema


一、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。

  1. 利用反射机制来推断包含特定类型对象的Schema

  • 创建Maven工程。打开IDEA开发工具,创建名为“spark_chapter04”的Maven工程。
  • 添加依赖。在pom.xml文件中添加Spark SQL依赖。
  • 定义case class样例类、字段和属性,样例类的参数名会被利用反射机制作为列名。通过sc对象读取文件生成一个RDD,将RDD 与样例类匹配,调用toDF()方法将RDD转换为DataFrame。
  1. 通过编程接口构造一个Schema

  • 创建一个Row对象结构的RDD。
  • 基于StructType类型创建Schema。
  • 通过SparkSession提供的createDataFrame()方法来拼接Schema,来实现RDD转换成DataFrame。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值