Pyspark学习笔记(六)
文章目录
- Pyspark学习笔记(六)
- 前言
- DataFrame简介
- 一、什么是 DataFrame ?
- 二、RDD 和 DataFrame 和 Dataset
- 三、选择使用DataFrame / RDD 的时机
前言
本篇博客讲的是DataFrame的基本概念
DataFrame简介
主要参考文献:
- A Tale of Three Apache Spark APIs: RDDs vs DataFrames and Datasets
- RDDs vs. Dataframes vs. Datasets – What is the Difference and Why Should Data Engineers Care?
一、什么是 DataFrame ?
在Spark中, DataFrame 是组织成 命名列[named colums]的分布时数据集合。它在概念上等同于关系数据库中的表或R/Python中的数据框,但在幕后做了更丰富的优化。DataFrames可以从多种来源构建,例如:结构化数据文件、Hive中的表、外部数据库或现有RDD.
DataFrame 首先在Spark 1.3 版中引入,以克服Spark RDD 的局限性。Spark DataFrames 是数据点的分布式集合,但在这里,数据被组织到命名列中。DataFrames 可以将数据读取和写入格式, 如 CSV、JSON、AVRO、HDFS 和 HIVE表。它已经针对大多数预处理任务进行了优化,可以处理大型数据集,因此我们不需要自己编写复杂的函数。
DataFrame 旨在使大型数据集的处理更加容易,允许开发人员将结构强加到分布式数据集合上,从而实现更高级别的抽象;它提供了一个领域特定的语言API 来操作分布式数据。
二、RDD 和 DataFrame 和 Dataset
Spark Datasets 是 DataFrame API 的扩展,具有RDD和 Datasets的有点。它速度快,并且提供了类型安全的接口。
注意,不能在Python中创建Spark Dataset。 Dataset API 仅在 Scala 和 Java中可用。即使使用PySpark的时候,我们还是用DataFrame来进行操作,我这里仅将Dataset列出来做个对比,增加一下我们的了解。
图片出处链接. 最初,他们在 2011 年提出了 RDD 的概念,然后在 2013 年提出了数据帧,后来在 2015 年提出了数据集的概念。它们都没有折旧,我们仍然可以使用它们。
RDD | DataFrame | Dataset | |
---|---|---|---|
数据表示 | RDD 是没有任何模式的数据元素的分布式集合 | 它也是组织成命名列的分布式集合 | 它是 Dataframes 的扩展,具有更多特性,如类型安全和面向对象的接口 |
优化 | 没有针对 RDD 的内置优化引擎。开发人员需要自己编写优化的代码 | 使用catalyst optimizer进行优化 | 使用catalyst optimizer进行优化 |
图式投影 | 需要手动定义模式 | 将自动查找数据集的架构 | 还将使用SQL引擎自动查找数据集的架构 |
聚合操作 | RDD比Dataframes和Dataset执行简单操作(如分组数据)都要慢 | 提供了一个简单的API来执行聚合操作。它比RDD和Dataset都更快地执行聚合 | DataSet比RDDs快,但比Dataframes慢一点 |
三、选择使用DataFrame / RDD 的时机
- 如果想要丰富的语义、高级抽象和特定于域的API,请使用DataFrame;
- 如果 需要高级表达式、筛选器、映射、聚合、平均值、SUM、SQL查询、列式访问和对半结构化数据的lambda函数的使用,请使用DataFrame;
- 如果您希望在编译时具有更高的类型安全性,则需要类型化JVM对象,利用催化剂优化,并从Tungsten高效的代码生成中获益,请使用DataSet;
- 如果您希望跨spark库统一和简化API,请使用DataFrame;如果您是R用户,请使用DataFrames;
- 如果是Python用户,请使用DataFrames,如果需要更多的控制,则使用RDD。