Limita(n) vs Show(n) de performanță disparitate în Pyspark

0

Problema

Încercarea de a obține o înțelegere mai profundă a modului scânteie de lucrări și a fost în jur de joc cu pyspark cli (2.4.0). Am fost în căutarea pentru diferența între utilizarea limit(n).show() și show(n). Am ajuns să primesc două performanțe foarte diferite ori pentru două foarte similare interogări. Mai jos sunt comenzile de care am fugit. Parchet fișier se face referire în codul de mai jos are aproximativ 50 de coloane și este de peste 50 gb în mărime de la distanță 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>>

Observați că planul fizic este aproape identic pentru ambele test1 și test2. Singura excepție este test2 planul lui începe cu "CollectLimit 5". După setarea asta am fugit test1.show(5) și test2.show(5). Test 1 returnate rezultatele instantaneu. Testul 2-a aratat o bară de progres cu sarcini 2010 și a durat aproximativ 20 de minute pentru a finaliza (am avut doar un executor)

Întrebare De ce am facut testul de 2 (cu limita) efectua atât de slab în comparație cu testul 1 (fara limita)? Setul de date și setul de rezultate au fost identice și planul fizic a fost aproape identice.

2

Cel mai bun răspuns

1

Păstrați în minte:

  • show() este un alias pentru show(20) și se bazează pe plan intern pe take(n: Int): Array[T]
  • limit(n: Int) se întoarce un alt set de date și este o operație costisitoare care citește întreg sursa
2021-11-23 20:59:09
0

Limita - rezultat din new dataframe și de a lua mai mult timp, deoarece acest lucru este pentru că predicatul pushdown nu este acceptată în prezent în format de fișier de intrare. Prin urmare, citirea întregului set de date și aplicarea de limită.

2021-11-24 02:21:07

Avem, deci, nu înseamnă că cele două teste ar fi mai performante similare daca lectură din MySQL in loc de HDFS?
cyclobster

În alte limbi

Această pagină este în alte limbi

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