Limit(n) vs Show(n) výkonnostní rozdíly v Pyspark

0

Otázka

Snaží se získat hlubší pochopení toho, jak jiskra funguje a hrál s pyspark cli (2.4.0). Hledal jsem rozdíl mezi použitím limit(n).show() a show(n). Dostala jsem dvě velmi odlišné výkon krát za dva velmi podobné dotazy. Níže jsou příkazy, které jsem běžel. Parkety souboru odkazováno v kódu níže má asi 50 sloupců a je přes 50 gb ve velikosti na dálkové 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šimněte si, že fyzický plán je téměř totožné pro oba test1 a test2. Jedinou výjimkou je test2 je plán začíná s "CollectLimit 5". Po toto nastavení jsem běžel test1.show(5) a test2.show(5). Test 1 se vrátil výsledky okamžitě. Test 2 ukázal pokrok bar s rokem 2010 úkoly a trvalo asi 20 minut na dokončení (měl jsem jen jeden exekutor)

Otázka Proč test 2 (s limitem) provádět tak špatně oproti testu 1 (bez omezení)? Datové sady a sady výsledků jsou totožné a fyzické plán byl téměř totožný.

2

Nejlepší odpověď

1

Mějte na paměti:

  • show() je alias pro show(20) a spoléhá na interně take(n: Int): Array[T]
  • limit(n: Int) vrátí další soubor údajů a je drahý provoz, který čte celý zdroj
2021-11-23 20:59:09
0

Limit - výsledek v novém datovém a trvá delší čas, protože to je proto, že predikát zásobníkových je v současné době nejsou podporovány ve vaší vstupní formát souboru. Proto čtení celý dataset a použití limit.

2021-11-24 02:21:07

To mám, takže to znamená, že dva testy je více podobný výkon, pokud čtení z MySQL místo HDFS?
cyclobster

V jiných jazycích

Tato stránka je v jiných jazycích

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