apache spark - ¿Algún problema de rendimiento que obligue a una evaluación entusiasta usando count in spark?
apache-spark (1)
Comúnmente veo
Dataset.count
largo de las bases de código en 3 escenarios:
-
logging
log.info("this ds has ${dataset.count} rows")
-
ramificación
if (dataset.count > 0) do x else do y
-
forzar un caché
dataset.persist.count
¿Evita que el optimizador de consultas cree el dag más eficiente al forzarlo a ser prematuro en cualquiera de esos escenarios?
TL; DR 1) y 2) por lo general pueden evitarse pero no deberían dañarlo (ignorando el costo de la evaluación), 3) es una práctica dañina de programación de culto de Cargo .
Sin
cache
Llamar a
count
solo es en su mayor parte un desperdicio.
Si bien no siempre es sencillo, el registro se puede reemplazar con la información recuperada de los oyentes (
aquí hay un ejemplo de RDD
), y los requisitos de flujo de control generalmente (no siempre) están mediados por un mejor diseño de canalización.
Solo no tendrá ningún impacto en el plan de ejecución (el plan de ejecución para el conteo, normalmente es diferente del plan de ejecución del padre. En general, Spark hace el menor trabajo posible, por lo que eliminará partes del plan de ejecución, que no están obligados a calcular la cuenta).
Con
cache
:
count
con
cache
es una mala práctica copiada ingenuamente de patrones utilizados con la API de RDD.
Ya es discutible con los
RDDs
, pero con
DataFrame
puede
romper muchas optimizaciones internas
(selección y empuje de predicados) y técnicamente hablando,
ni siquiera se garantiza que funcione
.