Límite(n) vs Mostrar(n) rendimiento de la disparidad en Pyspark

0

Pregunta

Tratando de obtener una comprensión más profunda de cómo la chispa de obras y estaba jugando con el pyspark cli (2.4.0). Yo estaba buscando la diferencia entre el uso de limit(n).show() y show(n). Acabé dos muy diferentes los tiempos de rendimiento para los dos muy similares a las consultas. A continuación se muestran los comandos que funcionó. El parqué de archivo que se hace referencia en el código de abajo tiene alrededor de 50 columnas y más de 50 gb en tamaño en remoto HDFS.

# Create dataframe
>>> df = sqlContext.read.parquet('hdfs://hdfs.host/path/to.parquet') ↵

# Create test1 dataframe
>>> test1 = df.select('test_col') ↵
>>> test1.schema ↵
StructType(List(StructField(test_col,ArrayType(LongType,true),true)))
>>> test1.explain() ↵
== Physical Plan ==
*(1) Project [test_col#40]
+- *(1) FileScan parquet [test_col#40]
    Batched: false,
    Format: Parquet,
    Location: InMemoryFileIndex[hdfs://hdfs.host/path/to.parquet],
    PartitionCount: 25,
    PartitionFilters: [],
    PushedFilters: [],
    ReadSchema: struct<test_col:array<bigint>>

# Create test2 dataframe
>>> test2 = df.select('test_col').limit(5) ↵
>>> test2.schema ↵
StructType(List(StructField(test_col,ArrayType(LongType,true),true)))
>>> test2.explain() ↵
== Physical Plan ==
CollectLimit 5
+- *(1) Project [test_col#40]
   +- *(1) FileScan parquet [test_col#40]
     Batched: false,
     Format: Parquet,
     Location: InMemoryFileIndex[hdfs://hdfs.host/path/to.parquet],
     PartitionCount: 25,
     PartitionFilters: [],
     PushedFilters: [],
     ReadSchema: struct<test_col:array<bigint>>

Observe que el plano físico es casi idéntico para ambos test1 y test2. La única excepción es test2 del plan comienza con "CollectLimit 5". Después de esta configuración me encontré test1.show(5) y test2.show(5). Prueba 1 devuelve los resultados al instante. Prueba 2 mostró una barra de progreso con tareas de 2010 y tomó cerca de 20 minutos para completar (yo sólo tenía una ejecutor)

Pregunta ¿Por qué se hizo la prueba 2 (con límite) realizar tan mal en comparación con la prueba 1 (sin límite)? El conjunto de datos y un conjunto de resultados fueron idénticos y el plan físico era casi idéntico.

2

Mejor respuesta

1

Tenga en cuenta:

  • show() es un alias para show(20) y depende internamente en take(n: Int): Array[T]
  • limit(n: Int) devuelve otro conjunto de datos y es una operación costosa en la que se lee la totalidad de la fuente
2021-11-23 20:59:09
0

Límite de resultado en nueva dataframe y tomar más tiempo debido a que esto es debido a que el predicado pushdown actualmente no se admite en su formato de archivo de entrada. Por lo tanto la lectura de todo el conjunto de datos y la aplicación de límite.

2021-11-24 02:21:07

Lo consiguió, por lo que hace que la media de las dos pruebas que se habría parecido más rendimiento si la lectura de MySQL en lugar de HDFS?
cyclobster

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................