Spark中的Transform和Action,为什么Spark要把操作分为Transform 和Action?常用的列举一些,说下算子原理 ?
在 Spark 中,操作被分为两种类型:Transformations(转换操作)和 Actions(行动操作)。这种设计主要是为了实现 Spark 的核心特性之一——惰性计算。
- Transformations(转换操作):这些操作用于创建一个新的 RDD(弹性分布式数据集)从现有的 RDDs。Transformations 是惰性的,意味着它们不会立即执行。实际的计算发生在一个 Action 操作被调用时。常见的转换操作包括
map
(将函数应用于 RDD 中的每个元素)、filter
(筛选出满足条件的元素)、flatMap
(与 map 类似,但每个输入项可以映射到 0 或多个输出项)等。 -
Actions(行动操作):这些操作用于在 RDDs 上执行计算并产生结果。当一个 Action 操作被调用时,Spark 会触发实际的计算过程。常见的行动操作包括
reduce
(对 RDD 中的元素应用一个函数,这个函数应该是可交换且可结合的,以便并行运算)、collect
(将整个 RDD 收集到一个中央节点上)、count
(计算 RDD 中的元素数量)等。
这种区分的原因在于 Spark 的工作方式。Spark 通过转换操作构建起一个称为“有向无环图”(DAG)的执行计划。当一个行动操作被调用时,Spark 会根据 DAG 来优化计算过程并开始实际的数据处理。这种设计允许 Spark 高效地处理大规模数据集,因为它只会在必要时进行计算,并且可以在整个数据处理过程中进行优化。
例如,在使用 map
转换对数据集进行一系列的处理后,直到调用例如 collect
或 count
这样的行动操作时,Spark 才会实际开始处理数据。这意味着,如果数据集很大,但你只对其中的一小部分感兴趣,Spark 可以优化执行计划,仅处理必要的数据,从而提高效率。