¿Cuándo usar Spark DataFrame / Dataset API y cuándo usar RDD simple?

El motor de ejecución Spark SQL DataFrame / Dataset tiene varias optimizaciones de tiempo y espacio extremadamente eficientes (por ejemplo, InternalRow y expression codeGen). Según muchas documentaciones, parece ser una mejor opción que RDD para la mayoría de los algoritmos distribuidos.

Sin embargo, hice una investigación de código fuente y todavía no estoy convencido. No tengo dudas de que InternalRow es mucho más compacto y puede ahorrar una gran cantidad de memoria. Pero la ejecución de algoritmos puede no ser más rápida al guardar expresiones predefinidas. A saber, se indica en el código fuente deorg.apache.spark.sql.catalyst.expressions.ScalaUDF, que cada función definida por el usuario hace 3 cosas:

convierte el tipo de catalizador (usado en InternalRow) en el tipo scala (usado en GenericRow).aplicar la funciónconvertir el resultado de tipo scala a tipo catalizador

Aparentemente, esto es aún más lento que simplemente aplicar la función directamente en RDD sin ninguna conversión. ¿Alguien puede confirmar o negar mi especulación mediante un análisis de código y perfiles de casos reales?

Muchas gracias por cualquier sugerencia o idea.