Spark的Row和InternalRow类型的区别

问题描述 投票:0回答:2

目前 Spark 有两种 Row 实现:

import org.apache.spark.sql.Row
import org.apache.spark.sql.catalyst.InternalRow

什么情况下需要两者都具备?它们是否表示相同的编码实体,但一个在内部使用(内部 API),另一个与外部 API 一起使用?

apache-spark apache-spark-sql apache-spark-dataset
2个回答
0
投票

Row 是(好吧..)Row 的稳定版本实现...但是,InternalRow 顾名思义,将在 Spark SQL 内部使用。我在下面引用了 InternalRow 的文档:

/**
 * An abstract class for row used internally in Spark SQL, which only contains the columns as
 * internal types.
 */
abstract class InternalRow extends SpecializedGetters with Serializable {

0
投票

总长:

  • Row
    :面向外部、不可变且用户友好。开发人员在与数据帧和数据集交互时使用它们。
  • InternalRow
    :面向内部、可变且性能优化,由 Spark 引擎用于执行和优化查询。

详细

是的,您是对的,

Row
InternalRow
在表示一行数据方面具有相似的用途。尽管如此,它们还是针对 Spark 中的不同用例和环境而设计的。

为什么 Spark 同时具有

Row
InternalRow

1. 关注点分离:

  • Row

    • 面向用户的 API
      Row
      被设计为公共 API 的一部分,这意味着它供开发人员在与 DataFrame 和数据集交互时外部使用。
    • 不变性
      Row
      是不可变的,因此可以安全地在并行处理中使用,而不必担心意外修改数据。
  • InternalRow

    • 内部 API
      InternalRow
      专为 Spark 的 Catalyst 优化器和查询执行引擎内部使用而设计。它针对性能进行了优化,特别是内存使用和访问速度。
    • 可变性:与
      Row,
      不同,
      InternalRow
      是可变的,允许Spark在执行期间就地修改行数据。这种可变性对于内部操作至关重要,例如查询优化和评估,其中数据必须动态调整。

2. 不同的用例:

  • 外部API (

    Row
    ):

    • 使用数据帧和数据集的用户需要易于理解和操作的行表示。
      Row
      提供了此接口,使得处理结构化数据变得简单。
    • Row
      用于面向用户的操作,例如查询、显示和转换数据。
  • 内部API (

    InternalRow
    ):

    • 在 Spark 内部,特别是在 Catalyst 优化器和执行引擎中,性能至关重要。
      InternalRow
      专为这些速度和内存效率至关重要的内部流程而设计。
    • InternalRow
      用于逻辑和物理查询计划执行等操作,其中更用户友好的界面的开销会对性能产生不利影响。

它们代表相同的编码实体吗?

  • 是的,但目标不同
    Row
    InternalRow
    最终都代表相同的概念:结构化格式的一行数据(如DataFrame)。然而,它们针对不同的目的进行了优化:
    • Row
      针对公共 API 环境中的可用性和安全性进行了优化。
    • InternalRow
      针对 Spark 内部执行引擎的性能和灵活性进行了优化。
© www.soinside.com 2019 - 2024. All rights reserved.