Limit(n) vs Show(n) výkon disparity v Pyspark

0

Otázka

Snaží získať hlbšie pochopenie toho, ako iskra funguje a bolo hrať sa s pyspark cli (2.4.0). Hľadal som rozdiel medzi využitím limit(n).show() a show(n). Skončil som dostáva dve veľmi odlišné výkonu krát za dva veľmi podobné otázky. Nižšie sú príkazy som bežal. Parkety súbor, na ktorý odkazuje kód nižšie sa asi 50 stĺpcov a je viac ako 50 gb vo veľkosti na diaľkové 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>>

Všimnite si, že fyzické plán je takmer totožné pre oba test1 a test2. Jedinou výnimkou je test2 plán začína "CollectLimit 5". Po nastavení tejto hore som bežal test1.show(5) a test2.show(5). Test 1 vrátený výsledky okamžite. Test 2 ukázal pokrok bar s rokom 2010 úlohy a trvalo asi 20 minút (som mal len jeden konateľ)

Otázka Prečo test 2 (s limitom) vykonávať tak zle v porovnaní s test 1 (bez obmedzenia)? Súbor údajov a výsledok nastaviť boli identické a fyzické plán bol takmer identický.

2

Najlepšiu odpoveď

1

Majte na pamäti:

  • show() je alias pre show(20) a spolieha sa na interne take(n: Int): Array[T]
  • limit(n: Int) vráti iný dokumentačný materiál a je veľmi náročná operácia, ktorá číta celý zdroj
2021-11-23 20:59:09
0

Limit - výsledok v new dataframe a užívať dlhšiu dobu, pretože je to preto, že predikát pushdown v súčasnosti nie je podporované vo vašom vstupný formát súboru. Preto čítanie celý dataset a uplatňuje limit.

2021-11-24 02:21:07

Dostal som to, tak znamená to, že dva testy by mať viac podobný výkon, ak čítania z, ako MySQL namiesto HDFS?
cyclobster

V iných jazykoch

Táto stránka je v iných jazykoch

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