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.
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.
- 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
Trabalhos práticos completos com Spark
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.Objetivos pedagógicos
- Spark instalado (veja o Capítulo 01)
- O
spark-shellacessível pelo seu terminal - Uma pasta de trabalho (exemplo:
C:/Users/user01/Desktop/SPARK/)
PARTE 0 – Dominar o spark-shell (REPL)
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.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)
import spark.implicits._ já é importado automaticamente (o que permite usar .toDF()).0.1 – Iniciar o spark-shell
# Windows (PowerShell) : spark-shell # macOS / Linux : ./bin/spark-shell # Ou se o Spark estiver no seu PATH : spark-shell
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
// 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|
// +------+------+_1 e _2 por padrão. Para dar nomes reais, use .toDF("linguagem", "ofertas") :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
: (dois-pontos). Esses comandos não são Scala, são próprios do REPL. Aprenda-os, eles vão economizar muito tempo!// Exibir a ajuda completa (lista de todos os comandos especiais) scala> :help
| Comando | Descrição | Exemplo |
|---|---|---|
: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 + 2 → Int |
: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 |
: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.// 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):paste, pressione Ctrl+D. Se pressionar Ctrl+C, você cancela o código colado..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:
# 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)
EOFPrática Spark SQL — AAPL & Income
AAPL.csv) e dados de renda (income.csv) — usando case class, RDD, DataFrame e funções de agregação do Spark SQL.Sumário
0. Apresentação dos dados & download
0.1 – Arquivo AAPL.csv (dados de ações da Apple)
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.| Coluna | Tipo | Descrição | Exemplo |
|---|---|---|---|
dt | String | Data da transação | 1984-09-07 |
openprice | Double | Preço de abertura do dia | 25.50 |
highprice | Double | Preço mais alto do dia | 26.10 |
lowprice | Double | Preço mais baixo do dia | 24.80 |
closeprice | Double | Preço de fechamento do dia | 25.90 |
volume | Double | Número de ações negociadas | 1234567.0 |
adjcloseprice | Double | Preço de fechamento ajustado (dividendos, splits) | 25.85 |
AAPL.csv — 3 métodos
Método 1 —
wget (recomendado, Windows/macOS/Linux)Baixe diretamente o arquivo bruto do GitHub :
wget https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv
Invoke-WebRequest se wget não estiver disponível :# PowerShell — baixar AAPL.csv na pasta atual Invoke-WebRequest -Uri "https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv" -OutFile "AAPL.csv"
git clone (clona todo o repositório)Clone o repositório completo e obtenha todos os arquivos de dados :
# Clonar o repositório inskillflow/data git clone https://github.com/inskillflow/data.git # O arquivo AAPL.csv estará em : # data/AAPL.csv
- Abra https://github.com/inskillflow/data/blob/main/AAPL.csv
- Clique no botão « Raw » no canto superior direito do arquivo
- Pressione Ctrl+S (ou Cmd+S no Mac) para salvar a página como
AAPL.csv
https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/AAPL.csv
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)
| Coluna | Tipo | Descrição |
|---|---|---|
id | Double | Identificador único |
workclass | String | Categoria de emprego (Private, Self-emp, Gov...) |
education | String | Nível de educação |
maritalstatus | String | Estado civil |
occupation | String | Profissão |
relationship | String | Relação familiar |
race | String | Origem étnica |
gender | String | Gênero |
nativecountry | String | País de origem |
income | String | Faixa de renda (<=50K ou >50K) |
age | Double | Idade do indivíduo |
fnlwgt | Double | Peso de ponderação estatística |
educationalnum | Double | Número de anos de educação |
capitalgain | Double | Ganhos de capital |
capitalloss | Double | Perdas de capital |
hoursperweek | Double | Horas trabalhadas por semana |
Income.csv — 3 métodos
Método 1 —
wgetwget https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/Income.csv
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/inskillflow/data/refs/heads/main/Income.csv" -OutFile "Income.csv"
git clone (clona os dois arquivos ao mesmo tempo)# 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
Option[T] que elimina NullPointerException, e ir além com Either e for-comprehensions.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
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.
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.
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
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"_ — 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
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:
// 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"
}}"// 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 lacunamatch 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.# 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# 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"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 CodeFAQ
Quanto tempo para aprender Scala PySpark Big Data?
Precisa de pré-requisitos?
Por onde começar na prática?
📬 Quer receber este tipo de guia toda semana? Inscreva-se gratuitamente — código real, zero enrolação.