使用 RDD 转换并在操作之前将其转换为数据集 VS 使用数据集及其 API

Using RDD transformation and converts it to a Dataset before an action VS using Dataset and its API

考虑两种情况:

A) 如果我有一个 RDD 并且在它上面调用了各种 RDD 转换,并且在完成任何操作之前我从它创建一个数据集。

B) 我在一开始就创建了一个数据集,并在其上调用了各种数据集方法。

问题:如果这两个场景在逻辑上产生相同的结果 - 一个使用 RDD 转换并在操作之前将其转换为 Dataset vs 仅使用 Dataset 及其转换 - 两种情况是否都经过相同的优化?

他们没有。 RDD API 不使用任何钨/催化剂优化,等效逻辑不相关。

不,他们没有。

当你对它们进行RDD和RDD转换时,没有做任何优化。当你最后将它转换为数据集时,然后才执行转换为基于钨的表示(占用更少的内存并且不需要通过垃圾收集)。

当您从一开始就使用数据集时,它将从一开始就使用基于钨的内存表示。这意味着它将占用更少的内存,洗牌将更小更快,并且不会发生 GC 开销(尽管从内部表示到 case class 的转换会在使用类型化操作时发生并返回)。如果您在数据集上使用数据帧操作,那么它还可以利用代码生成和催化剂优化。

另请参阅我的回答: