Когда использовать Spark DataFrame / Dataset API, а когда использовать обычный RDD?

Механизм исполнения Spark SQL DataFrame / Dataset имеет несколько чрезвычайно эффективных способов оптимизации времени и пространства (например, InternalRow и выражение codeGen). Согласно многим документациям, для большинства распределенных алгоритмов этот вариант лучше, чем RDD.

Тем не менее, я провел некоторые исследования исходного кода и до сих пор не убежден. Я не сомневаюсь, что InternalRow намного компактнее и может сохранить большой объем памяти. Но выполнение алгоритмов может не ускорить сохранение предопределенных выражений. А именно это указано в исходном кодеorg.apache.spark.sql.catalyst.expressions.ScalaUDF, что каждая пользовательская функция делает 3 вещи:

преобразовать тип катализатора (используется в InternalRow) в тип scala (используется в GenericRow).применить функциюпреобразовать результат обратно из типа Scala в тип катализатора

По-видимому, это даже медленнее, чем просто применять функцию непосредственно к СДР без какого-либо преобразования. Может ли кто-нибудь подтвердить или опровергнуть мои предположения с помощью профилирования и анализа кода?

Большое спасибо за любое предложение или понимание.

Ответы на вопрос(1)

Ваш ответ на вопрос