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