PySpark 面试题及答案

17 Mar 2025 | 阅读 17 分钟

1) 什么是 PySpark?/ 您对 PySpark 有什么了解?

PySpark 是由 Apache Spark 社区和 Python 开发的 Apache Spark 的一个工具或接口,用于支持 Python 与 Spark 的协同工作。该工具通过使用 Python 编写的 API 与 Apache Spark 协作,支持 Spark SQL、Spark DataFrame、Spark Streaming、Spark Core、Spark MLlib 等功能。它提供了一个交互式的 PySpark shell,用于在分布式环境中分析结构化和半结构化数据,并通过提供优化的 API 来处理这些数据,这些 API 有助于程序从各种数据源读取数据。PySpark 的功能是通过 py4j 库在 Python 中实现的。由于 py4j 库的存在,它使用户能够使用 Python 编程语言与 RDD(弹性分布式数据集)进行交互。Python 支持许多支持大数据处理和机器学习的库。

您可以使用以下命令通过 PyPi 安装 PySpark


2) PySpark 的主要特点是什么?

以下是 PySpark 的四个主要特点

  • 节点抽象: PySpark 中的节点是抽象的。这意味着我们无法访问单个工作节点。
  • PySpark 基于 MapReduce: PySpark 基于 Hadoop 的 MapReduce 模型。这意味着程序员提供 map 和 reduce 函数。
  • Spark 功能的 API: PySpark 提供用于利用 Spark 功能的 API。
  • 网络抽象: PySpark 提供网络抽象。这意味着 PySpark 中的网络是抽象的,它只支持隐式通信。

3) PySpark 中的 RDD 是什么?

在 PySpark 中,RDD 是 Resilient Distributed Datasets(弹性分布式数据集)的缩写。它是 PySpark 的核心数据结构。它是一个低级对象,在执行分布式任务方面非常高效。

PySpark 的 RDD 是可以在多个节点上运行和操作的元素,用于在集群上进行并行处理。这些是不可变元素。这意味着一旦创建了 RDD,就不能更改它。RDD 也是容错的。在发生任何故障时,它们会自动恢复。我们可以在 RDD 上应用多个操作来实现特定的任务。


4) PySpark 的主要优点和缺点是什么?

以下是 PySpark 的主要优点和缺点列表

PySpark 的优点

  • PySpark 是一种易于学习的语言。如果您了解 Python 和 Apache Spark,就可以轻松学习和实现它。
  • PySpark 易于使用。它提供并行化的代码,易于编写。
  • PySpark 框架中的错误处理很简单。您可以轻松处理错误并管理同步点
  • PySpark 是 Apache Spark 的 Python API。它提供了强大的库支持。与许多其他语言相比,Python 拥有大量的库来处理数据科学和数据可视化。
  • Spark 中已经编写和实现了许多重要算法。它在机器学习或图方面提供了许多算法。

PySpark 的缺点

  • PySpark 基于 Hadoop 的 MapReduce 模型,因此有时使用 MapReduce 模型管理和表达问题会变得困难。
  • 由于 Apache Spark 最初是用 Scala 编写的,而在 Python 程序中使用 PySpark 时,它们不如其他编程模型高效。它比 Scala 程序慢大约 10 倍。因此,这会负面影响重数据处理应用程序的性能。
  • PySpark 中的 Spark Streaming API 不如 Scala 高效。它仍然需要改进。
  • 在 PySpark 中,节点是抽象的,它使用抽象的网络,因此不能用于修改 Spark 的内部功能。在这种情况下,推荐使用 Scala。

5) 学习 PySpark 的先决条件是什么?

PySpark 易于学习和实现。它不需要精通多种编程语言或数据库。如果您了解一种编程语言和框架,就可以轻松学习它。在学习 PySpark 的概念之前,您应该了解一些 Apache Spark 和 Python 的知识。这将非常有助于学习 PySpark 的高级概念。


6) PySpark 中的分区为什么是不可变的?

在 PySpark 中,每次转换都会生成一个新的分区。分区使用 HDFS API 来创建不可变、分布式且容错的分区。分区还了解数据本地性。


7) RDD、DataFrame 和 DataSet 之间的主要区别是什么?

以下是 RDD、DataFrame 和 DataSet 之间的主要区别

RDD

  • RDD 是 Resilient Distributed Dataset 的缩写。它是 PySpark 的核心数据结构。
  • RDD 是一个低级对象,在执行分布式任务方面非常高效。
  • RDD 最适合进行低级转换、操作和对数据集的控制。
  • RDD 主要用于通过函数式编程结构来更改数据,而不是使用特定领域的表达式。
  • 如果您有需要重新计算的相似数据布局,RDD 可以有效地保留。
  • RDD 包含 PySpark 中的所有数据集和 DataFrame。

数据帧(DataFrame)

  • DataFrame 相当于 Spark SQL 中的关系表。它允许以表格和分段的形式查看结构。
  • 如果您正在使用 Python,最好从 DataFrame 开始,然后如果您想要更大的灵活性,可以切换到 RDD。
  • DataFrame 最大的缺点之一是编译时安全性。例如,如果信息结构未知,您将无法控制它。

DataSet

  • DataSet 是数据的分布式集合。它是 DataFrame 的一个子集。
  • DataSet 是 Spark 1.6 中新增的一个接口,用于提供 RDD 的优势。
  • DataSet 具有最佳的编码组件。它以结构化的方式提供时间安全性,不像信息边缘。
  • DataSet 在编译时提供了更高的类型安全性。如果您想要类型化的 JVM 对象,可以使用它。
  • 通过使用 DataSet,您可以利用 Catalyst 优化。您还可以使用它来利用 Tungsten 的快速代码生成。

8) 您对 PySpark SparkContext 有什么了解?

SparkContext 是任何 Spark 功能的入口点。当 Spark 应用程序运行时,它会启动驱动程序,主函数和 SparkContext 会被初始化。之后,驱动程序会在工作节点上的执行器中运行操作。在 PySpark 中,SparkContext 被称为 PySpark SparkContext。它使用 Py4J(库)启动一个 JVM,然后创建一个 JavaSparkContext。PySpark 的 SparkContext 默认可用为“sc”,因此无需创建新的 SparkContext。


9) PySpark StorageLevel 的用法是什么?

PySpark StorageLevel 用于控制 RDD 的存储。它控制 RDD 的存储方式和位置。PySpark StorageLevel 决定 RDD 是存储在内存、磁盘还是两者兼有。它还指定我们是否需要复制 RDD 分区或序列化 RDD。

以下是 PySpark StorageLevel 的代码


10) 您对数据清理有什么了解?

数据清理是通过分析数据并删除或修改不正确、不完整、不相关、重复或格式不正确的数据来准备数据的过程。


11) 什么是 PySpark SparkConf?

PySpark SparkConf 主要用于在本地/集群上运行 Spark 应用程序时设置一些配置和参数。换句话说,我们可以说 PySpark SparkConf 用于为运行 Spark 应用程序提供配置。


12) PySpark 支持哪些不同类型的算法?

PySpark 支持的不同类型的算法有

  • spark.mllib
  • mllib.regression
  • mllib.recommendation
  • mllib.clustering
  • mllib.classification
  • mllib.linalg
  • mllib.fpm

13) 什么是 SparkCore,SparkCore 的主要功能是什么?

SparkCore 是 Spark 平台的一个通用执行引擎,包含所有功能。它提供内存计算能力以实现高速运行,通用的执行模型以支持各种应用程序,以及 Java、Scala 和 Python API,这些 API 使开发变得容易。

SparkCore 的主要职责是执行所有基本的 I/O 功能、调度、监控等。它还负责故障恢复和有效的内存管理。

SparkCore 的主要功能是

  • 执行所有基本 I/O 功能
  • 作业调度
  • 监控作业
  • 内存管理
  • 容错
  • 与存储系统交互

注意:它还包括额外的库,可以划分流、机器学习和 SQL 的工作负载。


14) 您对 PySpark SparkFiles 有什么了解?

PySpark 允许用户通过 sc.addFile 上传他们的文件。在这里,sc 是我们的默认 SparkContext。我们还可以使用 SparkFiles.get 获取工作目录的路径。SparkFiles 提供了以下类型的类方法来解析通过 SparkContext.addFile() 添加的文件路径

  • get(filename)
  • getrootdirectory()

15) 您对 PySpark 序列化器有什么了解?

在 PySpark 中,序列化是一种用于对 Spark 进行性能调优的过程。PySpark 支持序列化器,因为我们必须持续检查通过网络发送或接收到磁盘或内存的数据。PySpark 支持两种类型的序列化器。它们是

  • PickleSerializer: 这用于使用 Python 的 PickleSerializer(使用类 pyspark.PickleSerializer)序列化对象。此序列化器支持几乎所有 Python 对象。
  • MarshalSerializer: MarshalSerializer 用于执行对象的序列化。这可以通过使用类 pyspark.MarshalSerializer 来实现。此序列化器比 PickleSerializer 快得多,但它只支持有限的类型。

16) 什么是 PySpark ArrayType?举例说明。

PySpark ArrayType 是一种集合数据类型,它扩展了 PySpark 的 DataType 类,该类是所有类型的超类。PySpark ArrayType 只包含相同类型的元素。还可以使用 ArraType() 方法来构造 ArrayType 的实例。

它接受两个参数

  • valueType: valueType 必须在 PySpark 中扩展 DataType 类。
  • valueContainsNull: 这是一个可选参数。它指定值是否可以接受 null,默认设置为 True。

示例


17) 最常用的 Spark 生态系统是什么?

最常用的 Spark 生态系统是

  • Spark SQL,面向开发人员。它也被称为 Shark。
  • Spark Streaming,用于处理实时数据流。
  • Graphx,用于生成和计算图。
  • MLlib(也称为机器学习算法)
  • SparkR,用于在 Spark 引擎中推广 R 编程语言。

18) PySpark 提供哪些机器学习 API?

与 Apache Spark 一样,PySpark 也提供了一个名为 MLlib 的机器学习 API。MLlib 支持以下类型的机器学习算法

  • mllib.classification: 这个机器学习 API 支持用于二元或多类分类和回归分析的各种方法,例如随机森林、决策树、朴素贝叶斯等。
  • mllib.clustering: 这个机器学习 API 解决了聚类问题,用于根据相似性将实体子集分组。
  • mllib.fpm: FPM 在这个机器学习 API 中代表频繁模式匹配。这个机器学习 API 用于挖掘频繁项、子序列或其他结构,用于分析大型数据集。
  • mllib.linalg: 这个机器学习 API 用于解决线性代数问题。
  • mllib.recommendation: 这个机器学习 API 用于协同过滤和推荐系统。
  • spark.mllib: 这个机器学习 API 用于支持基于模型的协同过滤,其中使用交替最小二乘法 (ALS) 算法识别小的潜在因子,用于预测缺失条目。
  • mllib.regression: 这个机器学习 API 使用回归算法解决问题,这些算法可以找到关系和变量依赖。

19) 什么是 PySpark 分区?您可以在 PySpark 中创建多少个分区?

PySpark 分区是一种基于一个或多个分区键将大型数据集拆分成更小数据集的方法。它提高了执行速度,因为对分区数据的转换运行得更快,因为每个分区的转换是并行执行的。PySpark 支持内存分区(DataFrame)和磁盘分区(文件系统)。当我们从文件或表创建 DataFrame 时,PySpark 会根据指定条件在内存中创建具有特定数量分区的 DataFrame。

它还允许我们通过 partitionBy() 使用多个列创建分区,方法是将您想分区的列作为参数传递给此方法。

语法

在 PySpark 中,建议的分区数是集群中可用于应用程序的核心数的 4 倍。


20) 您对 PySpark DataFrames 有什么了解?

PySpark DataFrames 是结构良好数据的分布式集合。它们相当于关系数据库表,并被放入命名列中。PySpark DataFrames 比 R 或 Python 编程语言经过了更好的优化,因为它们可以从 Hive 表、结构化数据文件、现有 RDD、外部数据库等不同来源创建。

PySpark DataFrame 的最大优势在于,PySpark DataFrame 中的数据分布在集群的不同机器上,并且对这些数据的操作将在所有机器上并行运行。这有助于处理大量结构化或半结构化的 PB 级数据。


21) 您对 PySpark DataFrame 中的“join”有什么了解?PySpark 中有哪些不同类型的 join?

在 PySpark 中,join 将两个 DataFrame 合并或连接在一起。它使我们能够将两个或多个 DataFrame 连接起来。

INNER Join、LEFT OUTER Join、RIGHT OUTER Join、LEFT ANTI Join、LEFT SEMI Join、CROSS Join 和 SELF Join 是 PySpark 支持的 SQL join 类型。以下是 PySpark Join 的语法。

语法

参数解释

join() 过程接受以下参数并返回一个 DataFrame

  • “other”: 它指定 join 的右侧。
  • “on”: 它指定 join 列的名称。
  • “how”: 用于指定一个选项。选项包括 inner、cross、outer、full、full outer、left、left outer、right、right outer、left semi 和 left anti。默认是 inner。

PySpark DataFrame 中的 Join 类型

Join 字符串等效的 SQL Join
innerINNER JOIN (内连接)
outer, full, fullouter, full_outer全外连接 (FULL OUTER JOIN)
left, leftouter, left_outerLEFT JOIN
right, rightouter, right_outerRIGHT JOIN
cross 
anti, leftanti, left_anti 
semi, leftsemi, left_semi 

22) PySpark 中的 Parquet 文件是什么?

在 PySpark 中,Parquet 文件是一种列式存储格式,受到多种数据处理系统的支持。通过使用 Parquet 文件,Spark SQL 可以执行读写操作。

Parquet 文件包含列式存储格式,这提供了以下优点

  • 它体积小,占用空间少。
  • 它使我们能够获取特定列进行访问。
  • 它遵循类型特定的编码。
  • 它提供更好的汇总数据。
  • 它包含非常有限的 I/O 操作。

23) 您对集群管理器有什么了解?PySpark 支持哪些不同的集群管理器类型?

在 PySpark 中,集群管理器是一个集群模式平台,它通过根据工作节点的需要提供所有资源来支持 Spark 的运行。

Spark 集群管理器生态系统包含一个主节点和多个工作节点。主节点通过集群管理器根据工作节点的需要为它们提供内存、处理器分配等资源。

PySpark 支持以下集群管理器类型

  • Standalone: 这是一个 Spark 自带的简单集群管理器。
  • Apache Mesos: 这个集群管理器用于运行 Hadoop MapReduce 和 PySpark 应用程序。
  • Hadoop YARN: 这个集群管理器用于 Hadoop2。
  • Kubernetes: 这个集群管理器是一个开源的集群管理器,有助于自动化容器化应用程序的部署、扩展和自动管理。
  • local: 这个集群管理器是用于在笔记本电脑/台式机上运行 Spark 应用程序的模式。

24) 为什么 PySpark 比 pandas 快?

PySpark 比 pandas 快,因为它支持在分布式环境中并行执行语句。例如,PySpark 可以在不同的核心和机器上执行,而 Pandas 无法做到。这是 PySpark 比 pandas 快的主要原因。


25) get(filename) 和 getrootdirectory() 之间的区别是什么?

get(filename) 和 getrootdirectory() 之间的主要区别在于,get(filename) 用于获取通过 SparkContext.addFile() 添加的文件的正确路径。另一方面,getrootdirectory() 用于获取包含通过 SparkContext.addFile() 添加的文件的根目录。


26) 您对 Pyspark 中的 SparkSession 有什么了解?

在 PySpark 中,SparkSession 是应用程序的入口点。在 PySpark 的第一个版本中,SparkContext 被用作入口点。自 PySpark 2.0 版本以来,SparkSession 就是 SparkContext 的替代品。在 PySpark 2.0 版本之后,SparkSession 作为访问所有与 RDD、DataFrame、DataSet 等相关的 PySpark 功能的起点。它也是一个统一的 API,用于替换 PySpark 中的 SQLContext、StreamingContext、HiveContext 以及所有其他上下文。

SparkSession 内部会根据 SparkSession 中提供的详细信息创建 SparkContext 和 SparkConfig。您可以使用构建器模式创建 SparkSession。


27) PySpark RDD 的主要优点是什么?

以下是 PySpark RDD 的主要优点列表

不可变性: PySpark RDD 是不可变的。一旦创建,就不能再修改。每当您尝试对 RDD 应用任何转换操作时,都必须创建一个新的 RDD。

容错: PySpark RDD 提供容错功能。当操作失败时,数据会自动从其他可用分区重新加载。这提供了 PySpark 应用程序执行的无缝体验。

分区: 当我们从任何数据创建 RDD 时,RDD 中的元素默认会分区到可用的核心。

惰性求值: PySpark RDD 遵循惰性求值过程。在 PySpark RDD 中,转换操作不会在遇到时立即执行。操作将存储在 DAG 中,并在找到第一个 RDD 操作时进行求值。

内存处理: PySpark RDD 用于帮助将数据从磁盘加载到内存。您可以将 RDD 持久化在内存中以重用计算。


28) 解释 Spark 程序的常见工作流程。

Spark 程序的常见工作流程可以分为以下几个步骤

  • 第一步,我们根据外部数据创建输入 RDD。数据可以从不同的数据源获得。
  • 创建 PySpark RDD 后,我们运行 RDD 转换操作,例如 filter() 或 map(),以根据业务逻辑创建新的 RDD。
  • 如果我们想要重用任何中间 RDD 以供将来使用,我们可以将它们持久化。
  • 最后,如果存在像 first()、count() 等操作,Spark 将启动它来启动并行计算。

29) 如何在 Spark 中实现机器学习?

我们可以通过使用 MLlib 来实现 Spark 中的机器学习。Spark 提供了一个可扩展的机器学习库 MLlib。它主要用于通过常用的机器学习算法和用例(如聚类、过滤、降维等)来创建可扩展且简单的机器学习。


30) 您对 PySpark 自定义剖析器有什么了解?

PySpark 支持自定义剖析器。自定义剖析器用于构建预测模型。剖析器还用于数据审查,以确保其有效性,并且我们可以将其用于消费。当我们想要自定义剖析器时,它需要定义以下一些方法

  • stats: 用于返回收集到的剖析统计信息。
  • profile: 用于生成某种系统剖析。
  • dump: 用于将剖析信息转储到指定路径。
  • dump(id, path): 用于将特定的 RDD ID 转储到给定的路径。
  • add: 用于将剖析信息添加到现有的累积剖析中。剖析类必须在创建 SparkContext 时选择。

31) 您对 Spark Driver 有什么了解?

Spark Driver 是一个在机器主节点上运行的计划。它主要用于对数据 RDD 执行操作和转换。


32) 什么是 PySpark SparkJobinfo?

PySpark SparkJobinfo 用于获取有关正在执行的 SparkJobs 的信息。

以下是使用 SparkJobInfo 的代码


33) Spark Core 的主要功能是什么?

Spark Core 的主要任务是实现内存管理、容错、作业监控、作业设置和与存储系统的通信等多种重要功能。它还包含基于中间层的附加库,用于处理流、机器学习和 SQL 的各种工作负载。

Spark Core 主要用于以下任务

  • 容错和恢复。
  • 与存储系统交互。
  • 内存管理。
  • 在集群上调度和监控作业。

34) 您对 PySpark SparkStageinfo 有什么了解?

PySpark SparkStageInfo 用于获取有关当前可用的 SparkStages 的信息。以下是用于 SparkStageInfo 的代码


35) Spark 执行引擎的用途是什么?

Apache Spark 执行引擎是一个图执行引擎,允许用户以高效率分析大型数据集。如果您希望以多阶段处理方式处理数据,则需要将 Spark 保留在内存中以大幅提高性能。


36) Akka 在 PySpark 中的用途是什么?

Akka 在 PySpark 中用于调度。当工作节点在注册后向主节点请求任务时,主节点会将其分配给它。在这种情况下,Akka 在工作节点和主节点之间发送和接收消息。


37) 您对 PySpark 中的 startsWith() 和 endsWith() 方法有什么了解?

PySpark 中的 startsWith() 和 endsWith() 方法属于 Column 类,用于通过检查列值是否以某个值开头或以某个值结尾来搜索 DataFrame 行。两者都用于过滤应用程序中的数据。

  • startsWith() 方法: 此方法用于返回布尔值。当列的值以指定字符串开头时,它显示 TRUE,当列值不匹配时,它显示 FALSE。
  • endsWith() 方法: 此方法用于返回布尔值。当列的值以指定字符串结尾时,它显示 TRUE,当列值不匹配时,它显示 FALSE。这两个方法都是区分大小写的。

38) 您对 RDD Lineage 有什么了解?

RDD Lineage 是一种用于重建丢失数据分区的过程。Spark 不支持内存中的数据复制。如果数据丢失,我们必须使用 RDD Lineage 重新构建它。这是最好的用例,因为 RDD 始终记住如何从其他数据集中构建。


39) 我们可以从外部数据源创建 PySpark DataFrame 吗?

是的,我们可以从外部数据源创建 PySpark DataFrame。实时应用程序使用本地、HDFS、HBase、MySQL 表、S3 Azure 等外部文件系统。以下示例显示了如何通过读取本地系统中的 CSV 文件来创建 DataFrame

PySpark 支持 csv、text、avro、parquet、tsv 和许多其他文件扩展名。


40) SparkConf 中使用的主要属性是什么?

以下是 SparkConf 中使用的主要属性列表

  • set(key, value): 此属性用于设置配置属性。
  • setSparkHome(value): 此属性用于设置工作节点上的 Spark 安装路径。
  • setAppName(value): 此属性用于设置应用程序名称。
  • setMaster(value): 此属性用于设置主 URL。
  • get(key, defaultValue=None): 此属性支持获取键的配置值。
  • li>

41) 如何将 Spark 与 Apache Mesos 相关联?

我们可以按照以下步骤将 Spark 与 Mesos 相关联

  • 首先,配置 sparkle 驱动程序以与 Mesos 相关联。
  • Spark 配对的包必须在 Mesos 开放的区域中。
  • 之后,在与 Apache Mesos 相同的区域安装 Apache Spark,并将属性“spark.mesos.executor.home”设置为指向其安装位置。

42) Spark 支持哪些主要文件系统?

Spark 支持以下三种文件系统

  • 本地文件系统。
  • Hadoop 分布式文件系统 (HDFS)。
  • Amazon S3

43) 如何触发 Spark 的自动清理以处理累积的元数据?

我们可以通过设置参数 'Spark.cleaner.ttl' 或将长时间运行的作业分成不同的批次并将中间结果写入磁盘来触发 Spark 的自动清理。


44) 在使用 Spark 处理信息时,如何限制信息移动?

我们可以通过以下方式限制使用 Spark 处理信息时的信息移动

  • 通信
  • 累加器因子

45) Spark SQL 与 HQL 和 SQL 有何不同?

HQL(Hive 查询语言)使用 Hive,而 Spark SQL 使用结构化查询语言进行数据处理和查询。我们可以轻松地将 SQL 表和 HQL 表连接到 Spark SQL。Flash SQL 作为 Spark Core 引擎上的一个独特组件,支持 SQL 和 Hive 查询语言,而无需更改任何语句结构。


46) PySpark 中的 DStream 是什么?

在 PySpark 中,DStream 是 Discretized Stream 的缩写。它是一组信息或 RDD 的集合,被分成小的批次。它也称为 Apache Spark Discretized Stream,并用作集合中的 RDD 集合。DStreams 基于 Spark RDD,并用于使 Streaming 能够与其他 Apache Spark 组件(如 Spark MLlib 和 Spark SQL)无缝集成。