Limite(n) vs Show(n) performance disparité dans Pyspark

0

La question

En essayant d'obtenir une compréhension plus profonde de la façon dont étincelle au travail et a joué avec les pyspark cli (2.4.0). Je cherchais la différence entre l'utilisation de limit(n).show() et show(n). J'ai fini par obtenir deux très différents les délais d'exécution pour les deux requêtes semblables. Voici les commandes que j'ai couru. Le parquet de fichier référencé dans le code ci-dessous a environ 50 colonnes et est de plus de 50 go en taille sur la télécommande 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>>

Notez que le plan physique est presque identique pour les deux test1 et test2. La seule exception est test2 du plan commence avec "CollectLimit 5". Après cette mise en place, j'ai couru test1.show(5) et test2.show(5). Test 1 retourné les résultats instantanément. Test 2 a montré une barre de progression avec des tâches 2010 et a pris environ 20 minutes pour compléter (je n'avais qu'un exécuteur testamentaire)

Question Pourquoi avez-test 2 (à la limite) effectuer un mal par rapport au test 1 (sans limite)? L'ensemble de données et un jeu de résultats étaient identiques et le plan physique était presque identique.

2

La meilleure réponse

1

Gardez à l'esprit:

  • show() est un alias pour show(20) et s'appuie en interne sur take(n: Int): Array[T]
  • limit(n: Int) renvoie un autre ensemble de données et est une opération coûteuse qui lit l'intégralité de la source
2021-11-23 20:59:09
0

Limite - le résultat dans une nouvelle dataframe et en prenant plus de temps, car c'est parce que le prédicat refoulement est actuellement pas pris en charge dans votre format de fichier d'entrée. Ainsi, la lecture ensemble du jeu de données et de l'application de la limite.

2021-11-24 02:21:07

Il a obtenu, est-ce que signifient les deux tests aurait plus de performances similaires si la lecture de comme MySQL au lieu de SF?
cyclobster

Dans d'autres langues

Cette page est dans d'autres langues

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