¿Cómo saber qué consulta de conteo es la más rápida?

He estado explorando optimizaciones de consultas en las versiones recientes de Spark SQL 2.3.0-SNAPSHOT y noté diferentes planes físicos para consultas semánticamente idénticas.

Supongamos que tengo que contar el número de filas en el siguiente conjunto de datos:

val q = spark.range(1)

Podría contar el número de filas de la siguiente manera:

q.countq.collect.sizeq.rdd.countq.queryExecution.toRdd.count

Mi pensamiento inicial fue que es casi una operación constante (seguramente debido a un conjunto de datos local) quede alguna manera han sido optimizados por Spark SQL y darían un resultado inmediato, especialmente. el primero donde Spark SQL tiene el control total de la ejecución de la consulta.

Habiendo examinado los planes físicos de las consultas me llevó acreer que la consulta más efectiva sería la última:

q.queryExecution.toRdd.count

Las razones son que:

Evita deserializar filas de susInternalRow formato binarioLa consulta está codificadaSolo hay un trabajo con una sola etapa

El plan físico es tan simple como eso.

¿Es correcto mi razonamiento? Si es así, ¿la respuesta sería diferente si leyera el conjunto de datos de una fuente de datos externa (por ejemplo, archivos, JDBC, Kafka)?

La pregunta principal es ¿cuáles son los factores a tener en cuenta para decir si una consulta es más eficiente que otras (según este ejemplo)?

Los otros planes de ejecución para completar.

q.count

q.collect.size

q.rdd.count

Respuestas a la pregunta(2)

Su respuesta a la pregunta