Pyspark'ta Limit (n) ve Gösteri (n) performans eşitsizliği

0

Soru

Spark'ın nasıl çalıştığına dair daha derin bir anlayış elde etmeye çalışmak ve pyspark clı (2.4.0) ile oynuyordu. Kullanmak arasındaki farkı arıyordum limit(n).show() ve show(n). İki çok benzer sorgu için iki çok farklı performans süresi elde ettim. Çalıştırdığım komutlar aşağıdadır. Aşağıdaki kodda başvurulan parke dosyası yaklaşık 50 sütuna sahiptir ve uzak HDF'LERDE 50gb'ın üzerindedir.

# 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>>

Fiziksel planın her ikisi için de hemen hemen aynı olduğuna dikkat edin test1 ve test2. Tek istisna, test2'nin planının "CollectLimit 5"ile başlamasıdır. Bunu kurduktan sonra koştum test1.show(5) ve test2.show(5). Test 1 sonuçları anında döndürdü. Test 2, 2010 görevleriyle bir ilerleme çubuğu gösterdi ve tamamlanması yaklaşık 20 dakika sürdü (yalnızca bir yürütücüm vardı)

Soru Test 2 (limitsiz) neden test 1'e (limitsiz) kıyasla bu kadar kötü performans gösterdi? Veri kümesi ve sonuç kümesi aynıydı ve fiziksel plan neredeyse aynıydı.

2

En iyi cevabı

1

Unutmamak:

  • show() için bir takma addır show(20) ve dahili olarak güvenir take(n: Int): Array[T]
  • limit(n: Int) başka bir veri kümesi döndürür ve tüm kaynağı okuyan pahalı bir işlemdir
2021-11-23 20:59:09
0

Sınırla-yeni veri çerçevesiyle sonuçlanır ve daha uzun zaman alır, çünkü bunun nedeni yüklemin itilmesinin şu anda giriş dosyası biçiminizde desteklenmemesidir. Bu nedenle, tüm veri kümesini okumak ve sınır uygulamak.

2021-11-24 02:21:07

Anladım, bu iki testin HDF'LER yerine MySQL gibi okunması durumunda daha benzer performansa sahip olacağı anlamına mı geliyor?
cyclobster

Diğer dillerde

Bu sayfa diğer dillerde

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