Tentando obter uma compreensão mais profunda de como a faísca trabalha e estava brincando com o pyspark cli (2.4.0). Eu estava olhando para a diferença entre o uso de limit(n).show()
e show(n)
. Eu acabei ficando dois diferentes tempos de desempenho para duas consultas semelhantes. Abaixo estão os comandos que eu corria. O parquet arquivo referenciado no código abaixo tem cerca de 50 colunas e mais de 50 gb de tamanho no remoto 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>>
Observe que o plano físico é quase idêntico para ambos os test1
e test2
. A única exceção é test2 plano começa com "CollectLimit 5". Depois de definir isso até eu corri test1.show(5)
e test2.show(5)
. Teste 1 devolvidos os resultados instantaneamente. Teste 2 mostrou uma barra de progresso com tarefas de 2010 e levou cerca de 20 minutos para completar (eu só tinha um executor)
Pergunta Por que o teste 2 (com limite) realizar tão mal em relação ao teste 1 (sem limite)? O conjunto de dados e o conjunto de resultados foram idênticos e o plano físico era quase idêntico.