Scala PySpark Big Data na prática: o código e os comandos que realmente importam

Scala PySpark Big Data: o essencial em um artigo — código real, diagramas e etapas concretas, extratos de um curso de 47 lições.

Scala PySpark Big Data na prática: o código e os comandos que realmente importam

Não há teoria interminável aqui: abra o terminal e pratique. Aqui está o essencial de Scala PySpark Big Data, extraído diretamente de um curso completo de 47 lições — com código real que você pode copiar e colar agora.

tl;dr
  • Introdução aos Paradigmas de Programação
  • Instalar o ambiente Big Data
  • Descobrir o Big Data e Spark
  • Fundamentos de Scala
  • Scala avançado para Spark
~$ cat ./parcours.md # Scala PySpark Big Data — 12 capítulos
01
Introdução aos Paradigmas de Programação
→ O paradigma imperativo e procedural→ O paradigma orientado a objetos+ 2 mais lições
02
Instalar o ambiente Big Data
→ Instalar Java JDK e Scala→ Instalar Apache Spark e PySpark+ 2 mais lições
03
Descobrir o Big Data e Spark
→ História e desafios do Big Data→ Ecossistema Apache Spark+ 1 mais lições
04
Fundamentos de Scala
→ Sintaxe básica e tipos de dados→ Funções, condições e loops+ 2 mais lições
05
Scala avançado para Spark
→ Classes, objetos e case classes→ Pattern matching e Options+ 4 mais lições
06
Fundamentos teóricos de Spark RDD DataFrame Dataset
→ Arquitetura interna de Spark→ RDD vs DataFrame vs Dataset+ 1 mais lições
07
RDD Resilient Distributed Datasets
→ O que é um RDD ?→ Transformações e ações nos RDD+ 1 mais lições
08
DataFrames e Spark SQL
→ O que é um DataFrame ?→ Operações e transformações nos DataFrames+ 2 mais lições
🏁
Projeto final (+ 4 capítulos no caminho)
→ Você sai com um projeto concreto e demonstrável

Trabalhos práticos completos com Spark

NOTEObjetivo — Colocar em prática todos os conceitos vistos no curso por meio de exercícios concretos no spark-shell (Scala) e PySpark. Este módulo é um laboratório prático guiado: você digita os comandos um por um e observa os resultados.
WARNINGFique tranquilo — Este TP foi projetado para ser seguido passo a passo. Cada comando é explicado. Você não precisa entender tudo imediatamente: o objetivo é manipular e ver os resultados. A compreensão virá com a prática.

Objetivos pedagógicos

TIPAo final deste módulo — Você será capaz de dominar estas competências essenciais.
NOTEPré-requisitos — Para acompanhar este TP, você precisa ter:
  • Spark instalado (veja o Capítulo 01)
  • O spark-shell acessível pelo seu terminal
  • Uma pasta de trabalho (exemplo: C:/Users/user01/Desktop/SPARK/)

PARTE 0 – Dominar o spark-shell (REPL)

NOTEO que é o spark-shell? — O spark-shell é um REPL (Read-Eval-Print Loop): um terminal interativo onde você digita um comando Scala, o Spark o executa imediatamente e exibe o resultado. É a ferramenta ideal para aprender e testar seus comandos Spark rapidamente, sem precisar criar um projeto completo.
TIPVariáveis criadas automaticamente — Ao iniciar o spark-shell, o Spark cria automaticamente duas variáveis para você:
  • spark: um objeto SparkSession (o ponto de entrada principal do Spark)
  • sc: um objeto SparkContext (usado para criar RDDs)
Você não precisa criá-las. Elas já estão prontas para uso. Além disso, import spark.implicits._ já é importado automaticamente (o que permite usar .toDF()).

0.1 – Iniciar o spark-shell

bash
# Windows (PowerShell) :
spark-shell

# macOS / Linux :
./bin/spark-shell
# Ou se o Spark estiver no seu PATH :
spark-shell
NOTESpark Web UI — Quando o spark-shell inicia, o Spark cria automaticamente uma interface web acessível em http://localhost:4040. Se a porta 4040 estiver ocupada, o Spark tenta 4041, 4042, etc. Essa interface permite visualizar os jobs, stages e tasks em andamento.

0.2 – Primeiro teste: criar um DataFrame

output
// Digite estes comandos um por um no spark-shell :

scala> import spark.implicits._
// já importado automaticamente, mas útil se você criar sua própria SparkSession

scala> val data = Seq(("Java", "20000"), ("Python", "100000"), ("Scala", "3000"))
// data: Seq[(String, String)] = List((Java,20000), (Python,100000), (Scala,3000))

scala> val df = data.toDF()
// df: org.apache.spark.sql.DataFrame = [_1: string, _2: string]

scala> df.show()
// +------+------+
// |    _1|    _2|
// +------+------+
// |  Java| 20000|
// |Python|100000|
// | Scala|  3000|
// +------+------+
TIPNomear as colunas — As colunas são chamadas _1 e _2 por padrão. Para dar nomes reais, use .toDF("linguagem", "ofertas") :
output
scala> val df = data.toDF("linguagem", "ofertas")
scala> df.show()
// +-------+------+
// |linguagem|ofertas|
// +-------+------+
// |   Java| 20000|
// | Python|100000|
// |  Scala|  3000|
// +-------+------+

0.3 – Comandos especiais do spark-shell

WARNINGMuito importante — O spark-shell possui comandos especiais que começam com : (dois-pontos). Esses comandos não são Scala, são próprios do REPL. Aprenda-os, eles vão economizar muito tempo!
output
// Exibir a ajuda completa (lista de todos os comandos especiais)
scala> :help
ComandoDescriçãoExemplo
:help Exibe a lista de todos os comandos disponíveis :help ou :he
:paste Modo « colar »: permite colar várias linhas de código de uma vez. Finalize com Ctrl+D. :paste
:load <arquivo> Carrega e executa um arquivo .scala linha por linha :load hello.scala
:load -v <arquivo> Carrega um arquivo em modo verbose (exibe cada linha executada) :load -v hello.scala
:quit Sair do spark-shell corretamente :quit ou :q
:history Exibe o histórico dos comandos digitados :history ou :history 20
:h? <palavra> Procurar uma palavra no histórico :h? toDF
:require <jar> Adicionar um arquivo JAR ao classpath durante a sessão :require /caminho/para/meu.jar
:type <expr> Exibe o tipo de uma expressão sem executá-la :type 1 + 2Int
:imports Exibe todos os imports ativos na sessão :imports
:implicits Exibe os implicits disponíveis :implicits -v
:reset Reinicia o REPL (apaga todas as variáveis) :reset
:replay Reinicia e reproduz todos os comandos anteriores :replay
:save <arquivo> Salva a sessão em um arquivo .scala :save minha_sessao.scala
:sh <cmd> Executa um comando shell (Unix/macOS apenas) :sh ls -la
:silent Ativa/desativa a exibição automática dos resultados :silent
:javap <classe> Desmonta uma classe Java / Scala :javap scala.Int
NOTEPor que :paste? — No spark-shell, se você colar código multilinha diretamente, o REPL tenta executar cada linha separadamente, o que causa erros. O modo :paste permite colar um bloco inteiro de código e executá-lo como um todo.
output
// Etapa 1 : digite :paste e pressione Enter
scala> :paste
// Entering paste mode (ctrl-D to finish)

// Etapa 2 : cole seu código multilinha
val nomes = Seq("Alice", "Bob", "Charlie")
val rdd = sc.parallelize(nomes)
val maiusculas = rdd.map(_.toUpperCase)
maiusculas.collect()

// Etapa 3 : pressione Ctrl+D para executar
// Exiting paste mode, now interpreting.

// nomes: Seq[String] = List(Alice, Bob, Charlie)
// rdd: org.apache.spark.rdd.RDD[String] = ...
// maiusculas: org.apache.spark.rdd.RDD[String] = ...
// res0: Array[String] = Array(ALICE, BOB, CHARLIE)
WARNINGCtrl+D, não Ctrl+C! — Para encerrar o modo :paste, pressione Ctrl+D. Se pressionar Ctrl+C, você cancela o código colado.
NOTECaso de uso — Você tem um arquivo .scala contendo funções ou processamentos que deseja executar no spark-shell. Em vez de copiar tudo, use :load.

Etapa 1 – Criar o arquivo Scala:

bash
# Windows (PowerShell) :
@"
println("Bonjour depuis le fichier Scala !")
val animaux = Seq("chat", "chien", "oiseau")
val rdd = sc.parallelize(animaux)
println("Nombre d'animaux : " + rdd.count())
rdd.collect().foreach(println)
"@ | Out-File -Encoding utf8 "C:\Users\user01\Desktop\SPARK\hello.scala"

# macOS / Linux :
cat > ~/Desktop/SPARK/hello.scala <<'EOF'
println("Bonjour depuis le fichier Scala !")
val animaux = Seq("chat", "chien", "oiseau")
val rdd = sc.parallelize(animaux)
println("Nombre d'animaux : " + rdd.count())
rdd.collect().foreach(println)
EOF

Prática Spark SQL — AAPL & Income

NOTEObjetivo: Aplicar Spark SQL em dois conjuntos de dados reais — dados de ações da Apple (AAPL.csv) e dados de renda (income.csv) — usando case class, RDD, DataFrame e funções de agregação do Spark SQL.
TIPPré-requisitos: Ter concluído a Parte 5 (projeto Maven IntelliJ). Spark instalado ou acesso a um ambiente Spark (Databricks, IntelliJ com Spark ou spark-shell).

Sumário

0. Apresentação dos dados & download

0.1 – Arquivo AAPL.csv (dados de ações da Apple)

NOTEO arquivo AAPL.csv contém o histórico de preços das ações da Apple (NASDAQ : AAPL). Cada linha representa um dia de negociação.
ColunaTipoDescriçãoExemplo
dtStringData da transação1984-09-07
openpriceDoublePreço de abertura do dia25.50
highpriceDoublePreço mais alto do dia26.10
lowpriceDoublePreço mais baixo do dia24.80
closepriceDoublePreço de fechamento do dia25.90
volumeDoubleNúmero de ações negociadas1234567.0
adjclosepriceDoublePreço de fechamento ajustado (dividendos, splits)25.85
NOTE Como baixar AAPL.csv — 3 métodos
Método 1 — wget (recomendado, Windows/macOS/Linux)
Baixe diretamente o arquivo bruto do GitHub :
bash
wget https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv
NOTENo Windows PowerShell, use o alias Invoke-WebRequest se wget não estiver disponível :
bash
# PowerShell — baixar AAPL.csv na pasta atual
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv" -OutFile "AAPL.csv"
NOTEMétodo 2 — git clone (clona todo o repositório)
Clone o repositório completo e obtenha todos os arquivos de dados :
bash
# Clonar o repositório inskillflow/data
git clone https://github.com/inskillflow/data.git

# O arquivo AAPL.csv estará em :
#   data/AAPL.csv
TIPMétodo 3 — Interface GitHub (sem terminal)
  1. Abra https://github.com/inskillflow/data/blob/main/AAPL.csv
  2. Clique no botão « Raw » no canto superior direito do arquivo
  3. Pressione Ctrl+S (ou Cmd+S no Mac) para salvar a página como AAPL.csv
Link direto para o arquivo bruto :
https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv
NOTELocalização do arquivo após o download: Coloque AAPL.csv em uma pasta acessível e ajuste o caminho no seu código :
  • Windows : C:\Users\SeuNome\Desktop\Spark\AAPL.csv
  • Linux / macOS : /home/usuario/data/AAPL.csv
  • Spark Shell (caminho relativo) : ./AAPL.csv

0.2 – Arquivo Income.csv (dados de renda)

ColunaTipoDescrição
idDoubleIdentificador único
workclassStringCategoria de emprego (Private, Self-emp, Gov...)
educationStringNível de educação
maritalstatusStringEstado civil
occupationStringProfissão
relationshipStringRelação familiar
raceStringOrigem étnica
genderStringGênero
nativecountryStringPaís de origem
incomeStringFaixa de renda (<=50K ou >50K)
ageDoubleIdade do indivíduo
fnlwgtDoublePeso de ponderação estatística
educationalnumDoubleNúmero de anos de educação
capitalgainDoubleGanhos de capital
capitallossDoublePerdas de capital
hoursperweekDoubleHoras trabalhadas por semana
NOTE Como baixar Income.csv — 3 métodos
Método 1 — wget
bash
wget https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/Income.csv
NOTENo Windows PowerShell :
bash
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/Income.csv" -OutFile "Income.csv"
NOTEMétodo 2 — git clone (clona os dois arquivos ao mesmo tempo)
bash
# Se você já clonou o repositório para AAPL.csv, Income.csv já está presente
# Caso contrário :
git clone https://github.com/inskillflow/data.git
# O arquivo Income.csv estará em :  data/Income.csv

Pattern matching e Options

NOTEObjetivo — Dominar o pattern matching, a ferramenta mais poderosa do Scala para comparar, ordenar e desconstruir dados. Descobrir o tipo Option[T] que elimina NullPointerException, e ir além com Either e for-comprehensions.
WARNINGFique tranquilo — O pattern matching é simplesmente o equivalente a um switch/case em Java ou a um match em Python 3.10+, mas muito mais poderoso. Se você já conhece if/elif/else em Python, entenderá sem dificuldade. O Scala adiciona a capacidade de verificar tipos, extrair dados de objetos e aplicar condições — tudo em uma sintaxe clara e compacta.

Objetivos pedagógicos

TIPAo final deste módulo — Você será capaz de dominar estas competências essenciais.

1. A analogia da triagem postal

Imagine um centro de triagem postal. Cada carta chega em uma esteira rolante. Um funcionário olha o endereço e envia a carta para a caixa correta: Paris à esquerda, Lyon à direita, Marselha em frente. Se o endereço não corresponder a nada conhecido, a carta vai para uma caixa « Outros ».

O pattern matching funciona exatamente como essa triagem postal: examinamos um valor, comparamos com vários modelos (patterns) e executamos o código associado ao primeiro modelo que corresponder.

TIPPor que é melhor que um if/else — O pattern matching é mais legível, mais seguro (o compilador verifica se todos os casos são cobertos com sealed trait) e muito mais poderoso, pois pode desconstruir objetos complexos, extrair valores e combinar tipo + valor + condição em um único case.

2. A sintaxe match/case

A expressão match recebe um valor e o compara com uma série de cláusulas case. A primeira cláusula que corresponder é executada. Diferente do switch Java, não há break para escrever — o Scala para automaticamente no primeiro caso correspondente.

NOTEConceito-chave — Em Scala, match é uma expressão, não uma instrução. Isso significa que ele sempre retorna um valor. Portanto, podemos escrever val x = valor match { ... }.

Exemplo 1 : os dias da semana

output
val jour = "Mercredi"

val typeJour = jour match {
  case "Lundi" | "Mardi" | "Mercredi" | "Jeudi" | "Vendredi" =>
    "Dia útil"
  case "Samedi" | "Dimanche" =>
    "Fim de semana"
  case _ =>
    "Dia desconhecido"  // _ = a caixa "Outros" da triagem postal
}

println(typeJour)  // "Dia útil"
NOTEO curinga _ — O símbolo _ (underscore) corresponde a « todo o resto ». Ele deve sempre ser colocado por último, pois captura tudo. Sem ele, se nenhum case corresponder, o Scala lança uma exceção MatchError em tempo de execução.

Exemplo 2 : converter uma nota em menção

output
val note = 15

val mention = note match {
  case 20                 => "Perfeito"
  case 16 | 17 | 18 | 19 => "Muito bom"
  case 14 | 15            => "Bom"
  case 12 | 13            => "Satisfatório"
  case 10 | 11            => "Regular"
  case _                  => "Insuficiente"
}

println(mention)  // "Bom"

Em Java ou Python, um switch ou match é uma instrução: ele faz algo, mas não retorna um valor diretamente. Em Scala, match é uma expressão: ele sempre retorna um valor.

O que isso muda na prática:

output
// Scala : match é uma expressão, pode ser atribuído diretamente
val categoria = age match {
  case a if a < 18  => "Menor"
  case a if a < 65  => "Adulto"
  case _            => "Idoso"
}

// Também pode ser usado como argumento de função
println(age match {
  case a if a < 18 => "Menor"
  case _           => "Adulto"
})

// Ou em interpolação de string
val message = s"Status : ${age match {
  case a if a < 18 => "Menor"
  case _           => "Adulto"
}}"
output
// Java : o switch (antes do Java 14) não retorna valor
// Era necessário escrever :
String categoria;
switch (age) {
  case ...: categoria = "Menor"; break;
  default:  categoria = "Adulto";
}
// Java 14+ adicionou switch expressions para preencher essa lacuna
TIPRegra prática — Como match retorna um valor, o compilador verifica se todos os branches retornam o mesmo tipo. Se um case retorna String e outro Int, o Scala infere o tipo comum (Any). Isso geralmente indica um erro de design.
output
# Python 3.10+ structural pattern matching
jour = "Mercredi"
match jour:
    case "Lundi" | "Mardi" | "Mercredi" | "Jeudi" | "Vendredi":
        type_jour = "Dia útil"
    case "Samedi" | "Dimanche":
        type_jour = "Fim de semana"
    case _:
        type_jour = "Dia desconhecido"

# Diferença : em Python, match é uma instrução (sem atribuição direta)
# Em Scala : val x = valor match { ... }  <-- expressão que retorna um valor
# Em Python : você deve atribuir em cada branch manualmente
output
# Python < 3.10 : sem match/case, usamos if/elif/else
jour = "Mercredi"

if jour in ("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi"):
    type_jour = "Dia útil"
elif jour in ("Samedi", "Dimanche"):
    type_jour = "Fim de semana"
else:
    type_jour = "Dia desconhecido"
va-plus-loin

Este artigo cobre os trechos mais úteis — o curso completo Scala PySpark Big Data (13 capítulos, 47 lições, exercícios corrigidos e projeto final) leva você até o fim.

./acessar-o-curso-completo curso gratuito : Dominando o Claude Code

FAQ

Quanto tempo para aprender Scala PySpark Big Data?
Com uma progressão estruturada (13 capítulos, 47 lições curtas e práticas), você atinge um nível operacional em algumas semanas, dedicando 30 a 60 minutos por dia. O importante é praticar cada conceito imediatamente.
Precisa de pré-requisitos?
Básicos de informática são suficientes. Se você sabe usar um terminal e ler código simples, está pronto.
Por onde começar na prática?
Reproduza os comandos deste artigo e depois siga o curso completo Scala PySpark Big Data: ele encadeia as 47 lições em ordem, com exercícios e projeto final.

📬 Quer receber este tipo de guia toda semana? Inscreva-se gratuitamente — código real, zero enrolação.