Saprk SQL DataFrame和Dataset

Saprk SQL DataFrame

在上一讲,我们重点讲解了 DataFrame 与 Spark SQL 的渊源,并提到,DataFrame 是 Spark SQL 的重要入口。换句话说,通过创建 DataFrame 并沿用 DataFrame 开发 API,我们才能充分利用 Spark SQL 优化引擎提供种种“性能红利”。显然,对于初学者来说,第一步的创建 DataFrame 就变得至关重要。

在 Spark 中,我们既可以用 Spark SQL + DataFrame 的组合实现海量数据分析,也可用 DataFrame + MLlib(Spark 机器学习库)的组合实现海量数据挖掘

在计算机领域中,高级往往意味着简单、封装程度高,而与之对应的通常是复杂、底层。对于 Spark 编程来说,RDD + 算子的组合无疑是比较底层的,而 DataFrame+SparkSQL的组合无论从学习成本,还是从性能开销上来说,都显著优于前者组合,所以无论是分析师还是程序员,这种方式才是使用 Spark 的首选

DataFrame、Dataset 的起源与演变

DataFrame 在 Spark 1.3 被引入,它的出现取代了 SchemaRDD,Dataset 最开始在 Spark 1.6 被引入,当时还属于实验性质,在 2.0 版本时正式成为 Spark 的一部分,并且在 Spark 2.0 中,DataFrame API 与 Dataset API 在形式上得到了统一

Dataset API 提供了类型安全的面向对象编程接口。Dataset 可以通过将表达式和数据字段暴露给查询计划程序和 Tungsten 的快速内存编码,从而利用 Catalyst 优化器。但是,现在 DataFrame 和 Dataset 都作为 Apache Spark 2.0 的一部分,其实 DataFrame 现在是 Dataset Untyped API 的特殊情况。

DataFrame = Dataset[Row]

DataFrame是未类型化的Dataset [Row],就是以前你要是想用Spark SQL来优化你的作业,那么你作业的对象必须是DataFrame,也就是你要把你自己定义的对象转成Row,但是现在不是了

由于 Python 不是类型安全的语言,所以 Spark Python API 没有 Dataset API,而只提供了 DataFrame API。当然,Java 和 Scala 就没有这种问题。

DataFrame相互转换Dataset

  1. DataFrame as 方法可以转换成DataSet
  2. DataSet toDF 可以转换成DataFrame
val df = spark.read.json("/databricks-datasets/samples/people/people.json")

在读取 JSON 文件时,Spark 不知道您的数据结构。也就是说,它不知道您希望如何将数据组织到特定于类型化的 JVM 对象中。它尝试从 JSON 文件推断架构,并创建一个DataFrame = Dataset[Row]通用Row对象。

可以通过定义特定于域的 Scala case class 并将 DataFrame 转换为该类型,将 your DataFrame 显式转换为Dataset反映 Scala 类对象:

// First, define a case class that represents a type-specific Scala JVM Object
case class Person (name: String, age: Long)

// Read the JSON file, convert the DataFrames into a type-specific JVM Scala object
// Person. At this stage Spark, upon reading JSON, created a generic
// DataFrame = Dataset[Rows]. By explicitly converting DataFrame into Dataset
// results in a type-specific rows or collection of objects of type Person
val ds = spark.read.json("/databricks-datasets/samples/people/people.json").as[Person]

将 aDataFrame 转换为特定于类型的 JVM 对象有两个原因。

  1. 首先,在显式转换后,对于使用 Dataset API 的所有关系表达式和查询表达式,您可以获得编译类型安全性。例如,如果使用错误的数据类型进行筛选操作,则 Spark 会检测不匹配类型并发出编译错误,而不是执行运行时错误,以便您更早地捕获错误。
  2. 其次,Dataset API 提供了高阶方法,这使得代码更易于阅读和开发。在“处理和可视化数据集”部分中,请注意使用Dataset类型化对象如何使代码更易于表达和阅读。

创建DataFrame

前面我们用了 SparkSession 的 read API 从 Parquet 文件创建 DataFrame,其实创建 DataFrame 的方法还有很多。毫不夸张地说,DataFrame 的创建途径异常丰富,为什么这么说呢?

Spark 支持多种数据源,按照数据来源进行划分,这些数据源可以分为如下几个大类:Driver 端自定义的数据结构、(分布式)文件系统、关系型数据库 RDBMS、关系型数据仓库、NoSQL 数据库,以及其他的计算引擎,此外还支持由 RDD 通过类型反射生成,甚至还可以通过流式数据源生成,

对于文件系统而言,Json、Parquet、ORC 等文件是自带 Schema 的,而那些无 Schema 的数据源,DataFrame 会自己生成 Sche

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值