Limite(n) vs Show(n) prestazioni disparità Pyspark

0

Domanda

Cercando di ottenere una più profonda comprensione di come scintilla opere e stava giocando con il pyspark cli (2.4.0). Stavo cercando la differenza tra l'utilizzo di limit(n).show() e show(n). Ho finito per ottenere due molto diverse volte per due molto simili query. Di seguito sono riportati i comandi mi sono imbattuto. Il parquet file a cui fa riferimento il codice qui di seguito è di circa 50 colonne e oltre 50gb di dimensioni in 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>>

Si noti che il piano fisico è quasi identico per entrambi test1 e test2. L'unica eccezione è test2 piano inizia con "CollectLimit 5". Dopo la configurazione di questo ho eseguito test1.show(5) e test2.show(5). Test 1 restituiti i risultati istantaneamente. Test di 2 hanno mostrato una barra di avanzamento con il 2010 le attività e ci sono voluti circa 20 minuti per completare (ho avuto un solo esecutore)

Domanda Perché ha fatto il test 2 (con limite) eseguire in modo poco rispetto al test di 1 (senza limite)? Il set di dati e set di risultati erano identici e il piano fisico era quasi identica.

2

Migliore risposta

1

Tenere a mente:

  • show() è un alias per show(20) e si basa su internamente take(n: Int): Array[T]
  • limit(n: Int) restituisce un altro set di dati è un'operazione costosa che si legge tutta di origine
2021-11-23 20:59:09
0

Il limite di risultati in nuova dataframe e prendere più tempo perché questo è perché il predicato pushdown al momento non è supportato il formato del file di input. Quindi la lettura di tutto il set di dati e l'applicazione di limite.

2021-11-24 02:21:07

Capito, quindi significa che le due prove, ha prestazioni simili se la lettura da come MySQL invece di HDFS?
cyclobster

In altre lingue

Questa pagina è in altre lingue

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