Como criar uma tabela Delta com PySpark no Lakehouse
Guardar dados transformados numa tabela Delta é a forma mais prática de os disponibilizar para análise no Microsoft Fabric. Com poucas linhas de PySpark, consegues criar uma tabela Delta gerida a partir de um DataFrame do Spark, diretamente num notebook e sem sair do Lakehouse. Depois de criada, a tabela fica logo pronta para consultas em SQL e para relatórios no Power BI — por isso, saber criar uma tabela Delta no Lakehouse é a base de quase todos os pipelines de dados no Fabric.
Pré-requisitos
- Uma capacidade do Microsoft Fabric ativa (avaliação gratuita, Premium ou uma SKU F).
- Um Lakehouse já criado no teu workspace.
- Permissões de Contributor (ou superior) nesse workspace, necessárias para escrever tabelas.
- Noções básicas de Python. Não precisas de instalar nem configurar o Spark: já vem pronto no Fabric.
Passo 1: Criar um notebook e anexar o Lakehouse
Abre o teu Lakehouse e seleciona Open notebook > New notebook. Em alternativa, cria um notebook a partir da experiência de Data Engineering e, no painel Explorer à esquerda, usa Add lakehouse para o associar. Este passo é essencial: o Lakehouse anexado torna-se o destino por omissão das tabelas que escreveres. Sem um Lakehouse anexado, o Spark não sabe onde gravar e a escrita falha.
Passo 2: Carregar os dados para um DataFrame
Para criar uma tabela precisas primeiro de um DataFrame do Spark. Neste exemplo lemos um ficheiro CSV guardado na secção Files do Lakehouse, mas a origem pode ser qualquer outra: uma tabela existente, o resultado de uma transformação ou uma consulta. As opções header e inferSchema ajudam o Spark a interpretar corretamente o cabeçalho e os tipos de dados.
df = (spark.read
.option("header", "true")
.option("inferSchema", "true")
.csv("Files/vendas/vendas.csv"))
df.printSchema()
display(df)
O comando display(df) apresenta uma pré-visualização interativa. Aproveita para confirmar que as colunas e os tipos ficaram como esperavas antes de avançar.
Passo 3: Escrever o DataFrame como tabela Delta
Com os dados no DataFrame, basta gravá-los na secção Tables em formato Delta. O método saveAsTable() cria uma tabela gerida: o Fabric escreve os ficheiros Parquet e regista a tabela no metastore num único passo.
(df.write
.format("delta")
.mode("overwrite")
.saveAsTable("vendas"))
O modo overwrite substitui a tabela caso já exista; troca para append quando quiseres acrescentar linhas a uma tabela já criada. Um detalhe importante para evitar erros: o Lakehouse do Fabric só suporta tabelas geridas. Não uses CREATE TABLE ... LOCATION nem cries subpastas dentro de Tables, porque o Lakehouse não as reconhece como tabelas e mostra-as como "Unidentified".
Passo 4: Otimizar a escrita com V-Order (opcional)
O Fabric pode organizar os ficheiros Parquet para leituras mais rápidas e menos espaço em disco. Se quiseres esse ganho, ativa o V-Order e o Optimize Write numa célula no início do notebook, antes de gravar:
spark.conf.set("spark.sql.parquet.vorder.enabled", "true")
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
Estas definições reduzem o número de ficheiros gerados e melhoram a compressão, sem exigirem qualquer alteração ao código de escrita do Passo 3.
Verificar o resultado
Confirma que a tabela foi criada de duas maneiras. Primeiro, no painel Explorer, expande a pasta Tables, clica nas reticências (...) e escolhe Refresh: a tabela vendas deve surgir com o ícone de tabela Delta. Depois, valida em código lendo a tabela de volta:
spark.sql("SELECT COUNT(*) AS total FROM vendas").show()
# ou diretamente a partir do caminho na secção Tables
spark.read.format("delta").load("Tables/vendas").show(5)
Se a contagem de linhas corresponder ao esperado, está tudo certo. A tabela fica também imediatamente disponível no SQL analytics endpoint do Lakehouse, onde a podes consultar com T-SQL.
Conclusão
Com o formato Delta e o método saveAsTable(), transformaste um DataFrame numa tabela gerida e pronta a analisar em poucos segundos — o padrão que vais repetir em praticamente todos os pipelines do Lakehouse. Como próximos passos, experimenta agendar esta escrita dentro de um pipeline do Fabric ou usar o modo append para carregamentos incrementais. Uma pergunta para pensares antes de avançar: como vais garantir que uma nova execução não cria linhas duplicadas na tua tabela?