Quando usar a API Spark DataFrame / Dataset e quando usar RDD simples?
O mecanismo de execução Spark SQL DataFrame / Dataset possui várias otimizações de tempo e espaço extremamente eficientes (por exemplo, InternalRow e expressão codeGen). De acordo com muitas documentações, parece ser uma opção melhor que o RDD para a maioria dos algoritmos distribuídos.
No entanto, eu fiz algumas pesquisas de código fonte e ainda não estou convencido. Não tenho dúvidas de que o InternalRow é muito mais compacto e pode economizar grande quantidade de memória. Mas a execução de algoritmos pode não ser mais rápida, salvando expressões predefinidas. Ou seja, é indicado no código fonte deorg.apache.spark.sql.catalyst.expressions.ScalaUDF
, que toda função definida pelo usuário faz três coisas:
Aparentemente, isso é ainda mais lento do que apenas aplicar a função diretamente no RDD sem nenhuma conversão. Alguém pode confirmar ou negar minha especulação através de perfis reais e análise de código?
Muito obrigado por qualquer sugestão ou insight.