Questão nº 14
Questão de Ciência de Dados · FGV SEFAZ-MG 2022 - Tarde (nº 14)
1. linhas = sc.textFile("dados.txt")
2. linhasComprimento = linhas.map(lambda s: len(s))
3. totalComprimento = linhasComprimento.reduce(lambda a, b: a + b)
Em relação ao código pyspark acima, assinale a afirmativa incorreta.
- AA primeira linha define um RDD a partir de um arquivo externo; este conjunto de dados não é carregado na memória.
- BA variável linhas não é apenas um ponteiro para o arquivo. (alternativa correta)
- CA segunda linha define linhasComprimento como resultado de uma transformação map.
- DA variável linhasComprimento não é calculada imediatamente, devido à propriedade lazy.
- EA terceira linha executa o reduce, que é uma ação.
Resposta comentada
Gabarito Alternativa B
Spark RDDs (Resilient Distributed Datasets) são coleções de dados imutáveis e distribuídas. Eles são a abstração fundamental do Spark para trabalhar com dados. O Spark opera com o conceito de avaliação preguiçosa (lazy evaluation): as transformações (como map, filter) apenas definem um plano de execução e criam um novo RDD, mas não executam o cálculo imediatamente. O cálculo só é disparado quando uma ação (como reduce, count, collect) é invocada, que então executa todo o plano de transformações desde a origem dos dados.
- (A) Incorreta: Esta afirmação é correta. A primeira linha (
sc.textFile("dados.txt")) cria um RDD (linhas) que representa as linhas do arquivodados.txt. No entanto, devido à avaliação preguiçosa do Spark, os dados do arquivo não são carregados na memória neste momento; apenas o RDD (o plano de como acessar e processar esses dados) é definido. - (B) Correta: Esta afirmação é incorreta, e por isso é o gabarito. A variável
linhasé essencialmente um ponteiro ou uma referência para a origem dos dados (o arquivodados.txt) e para o "plano" de como processar esses dados (o lineage das transformações). Ela não contém os dados em si, mas sim a receita ou o grafo de computação para obtê-los. Dizer que "não é apenas um ponteiro para o arquivo" é incorreto porque, no contexto da avaliação preguiçosa, um RDD é fundamentalmente uma referência ao dado de origem e ao plano de computação, e não o dado carregado na memória. A armadilha da banca aqui é a palavra "apenas": ao afirmar que "não é apenas um ponteiro", a frase sugere que a variávellinhascontém mais do que uma referência (talvez os próprios dados), o que é falso. - (C) Incorreta: Esta afirmação é correta. A segunda linha (
linhasComprimento = linhas.map(lambda s: len(s))) aplica a transformaçãomapao RDDlinhas, criando um novo RDD (linhasComprimento) que, quando computado, conterá os comprimentos das linhas. - (D) Incorreta: Esta afirmação é correta. Como
mapé uma transformação, e o Spark usa avaliação preguiçosa, o cálculo dos comprimentos das linhas não é realizado imediatamente quandolinhasComprimentoé definido. Ele só será executado quando uma ação for chamada posteriormente. - (E) Incorreta: Esta afirmação é correta. A terceira linha (
totalComprimento = linhasComprimento.reduce(lambda a, b: a + b)) invoca a operaçãoreduce, que é uma ação no Spark. As ações são o que disparam a execução do grafo de computação (o lineage dos RDDs) para produzir um resultado final.
Fonte: FGV SEFAZ-MG 2022 - Tarde Auditor Fiscal - Tecnologia da Informação (Caderno Tipo 1). Reproduzida para fins de estudo.