Limite(n) vs Show(n) desempenho disparidade na Pyspark

0

Pergunta

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.

2

Melhor resposta

1

Tenha em mente:

  • show() é um alias para show(20) e baseia-se internamente em take(n: Int): Array[T]
  • limit(n: Int) retorna um outro conjunto de dados e é uma operação cara que lê todo de origem
2021-11-23 20:59:09
0

Limite de resultar em novas dataframe e tendo mais tempo porque isso é porque o predicado pushdown não é actualmente suportado em seu arquivo de entrada de formato. Daí a leitura de todo o conjunto de dados e a aplicação de limite.

2021-11-24 02:21:07

Entendeu, então isso significa que os dois testes teria mais desempenho semelhante se a leitura de como o MySQL em vez de HDFS?
cyclobster

Em outros idiomas

Esta página está em outros idiomas

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