目前 Spark 有两种 Row 实现:
import org.apache.spark.sql.Row
import org.apache.spark.sql.catalyst.InternalRow
什么情况下需要两者都具备?它们是否表示相同的编码实体,但一个在内部使用(内部 API),另一个与外部 API 一起使用?
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 {
Row
:面向外部、不可变且用户友好。开发人员在与数据帧和数据集交互时使用它们。InternalRow
:面向内部、可变且性能优化,由 Spark 引擎用于执行和优化查询。是的,您是对的,
Row
和InternalRow
在表示一行数据方面具有相似的用途。尽管如此,它们还是针对 Spark 中的不同用例和环境而设计的。
为什么 Spark 同时具有
和Row
?InternalRow
Row
:
Row
被设计为公共 API 的一部分,这意味着它供开发人员在与 DataFrame 和数据集交互时外部使用。Row
是不可变的,因此可以安全地在并行处理中使用,而不必担心意外修改数据。InternalRow
:
InternalRow
专为 Spark 的 Catalyst 优化器和查询执行引擎内部使用而设计。它针对性能进行了优化,特别是内存使用和访问速度。Row,
不同,InternalRow
是可变的,允许Spark在执行期间就地修改行数据。这种可变性对于内部操作至关重要,例如查询优化和评估,其中数据必须动态调整。外部API (
Row
):
Row
提供了此接口,使得处理结构化数据变得简单。Row
用于面向用户的操作,例如查询、显示和转换数据。内部API (
InternalRow
):
InternalRow
专为这些速度和内存效率至关重要的内部流程而设计。InternalRow
用于逻辑和物理查询计划执行等操作,其中更用户友好的界面的开销会对性能产生不利影响。它们代表相同的编码实体吗?
Row
和InternalRow
最终都代表相同的概念:结构化格式的一行数据(如DataFrame)。然而,它们针对不同的目的进行了优化:
Row
针对公共 API 环境中的可用性和安全性进行了优化。InternalRow
针对 Spark 内部执行引擎的性能和灵活性进行了优化。