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ı.