Criar tabelas delta
Quando você cria uma tabela em um lago do Microsoft Fabric, uma tabela delta é definida no metastore para a lakehouse e os dados para a tabela são armazenados nos arquivos Parquet subjacentes para a tabela.
Com a maioria das ferramentas interativas no ambiente Microsoft Fabric, os detalhes do mapeamento da definição de tabela no metastore para os arquivos subjacentes são abstraídos. No entanto, ao trabalhar com o Apache Spark em uma lakehouse, você tem maior controle da criação e gerenciamento de tabelas delta.
Criando uma tabela delta a partir de um dataframe
Uma das maneiras mais fáceis de criar uma tabela delta no Spark é salvar um dataframe no formato delta . Por exemplo, o seguinte código PySpark carrega um dataframe com dados de um arquivo existente e, em seguida, salva esse dataframe como uma tabela delta:
# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)
# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")
O código especifica que a tabela deve ser salva no formato delta com um nome de tabela especificado. Os dados da tabela são salvos em arquivos Parquet (independentemente do formato do arquivo de origem carregado no dataframe) na área de armazenamento Tables na lakehouse, juntamente com uma pasta _delta_log contendo os logs de transações da tabela. A tabela está listada na pasta Tabelas da casa do lago no painel Explorador de dados.
Tabelas gerenciadas vs externas
No exemplo anterior, o dataframe foi salvo como uma tabela gerenciada , o que significa que a definição de tabela no metastore e os arquivos de dados subjacentes são gerenciados pelo tempo de execução do Spark para o lago Fabric. A exclusão da tabela também excluirá os arquivos subjacentes do local de armazenamento de Tabelas para a casa do lago.
Você também pode criar tabelas como tabelas externas , nas quais a definição de tabela relacional no metastore é mapeada para um local alternativo de armazenamento de arquivos. Por exemplo, o código a seguir cria uma tabela externa para a qual os dados são armazenados na pasta no local de armazenamento de arquivos para a casa do lago:
df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")
Neste exemplo, a definição de tabela é criada no metastore (portanto, a tabela é listada na interface do usuário Tables para a lakehouse), mas os arquivos de dados Parquet e os arquivos de log JSON para a tabela são armazenados no local de armazenamento de arquivos (e serão mostrados no nó Arquivos no painel Lakehouse explorer).
Você também pode especificar um caminho totalmente qualificado para um local de armazenamento, da seguinte forma:
df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")
A exclusão de uma tabela externa do metastore lakehouse não exclui os arquivos de dados associados.
Criação de metadados de tabela
Embora seja comum criar uma tabela a partir de dados existentes em um dataframe, geralmente há cenários em que você deseja criar uma definição de tabela no metastore que será preenchida com dados de outras maneiras. Há várias maneiras de atingir esse objetivo.
Usar a API DeltaTableBuilder
A API DeltaTableBuilder permite que você escreva código Spark para criar uma tabela com base em suas especificações. Por exemplo, o código a seguir cria uma tabela com um nome e colunas especificados.
from delta.tables import *
DeltaTable.create(spark) \
.tableName("products") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
Usar o Spark SQL
Você também pode criar tabelas delta usando a instrução Spark SQL CREATE TABLE
, conforme mostrado neste exemplo:
%%sql
CREATE TABLE salesorders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
O exemplo anterior cria uma tabela gerenciada. Você também pode criar uma tabela externa especificando um LOCATION
parâmetro, conforme mostrado aqui:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'
Ao criar uma tabela externa, o esquema da tabela é determinado pelos arquivos Parquet que contêm os dados no local especificado. Essa abordagem pode ser útil quando você deseja criar uma definição de tabela que faça referência a dados que já foram salvos no formato delta ou com base em uma pasta onde você espera ingerir dados no formato delta.
Guardar dados em formato delta
Até agora, você viu como salvar um dataframe como uma tabela delta (criando a definição de esquema de tabela no metastore e os arquivos de dados no formato delta) e como criar a definição de tabela (que cria o esquema de tabela no metastore sem salvar nenhum arquivo de dados). Uma terceira possibilidade é salvar dados no formato delta sem criar uma definição de tabela no metastore. Essa abordagem pode ser útil quando você deseja persistir os resultados das transformações de dados realizadas no Spark em um formato de arquivo sobre o qual você pode posteriormente "sobrepor" uma definição de tabela ou processo diretamente usando a API delta lake.
Por exemplo, o seguinte código PySpark salva um dataframe em um novo local de pasta no formato delta :
delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)
Os arquivos delta são salvos no formato Parquet no caminho especificado e incluem uma pasta _delta_log contendo arquivos de log de transações. Os logs de transações registram quaisquer alterações nos dados, como atualizações feitas em tabelas externas ou por meio da API delta lake.
Você pode substituir o conteúdo de uma pasta existente pelos dados em um dataframe usando o modo de substituição , conforme mostrado aqui:
new_df.write.format("delta").mode("overwrite").save(delta_path)
Você também pode adicionar linhas de um dataframe a uma pasta existente usando o modo de acréscimo :
new_rows_df.write.format("delta").mode("append").save(delta_path)
Gorjeta
Se você usar a técnica descrita aqui para salvar um dataframe no local Tabelas na casa do lago, o Microsoft Fabric usará um recurso de descoberta automática de tabela para criar os metadados de tabela correspondentes no metastore.