Criar tabelas de catálogo

Concluído

Até agora, consideramos instâncias de tabela do Delta Lake criadas com base em dataframes e modificadas por meio da API do Delta Lake. Você também pode definir tabelas do Delta Lake como tabelas de catálogo no metastore do Hive para o seu pool do Spark e trabalhar com elas usando SQL.

Tabelas externas versus gerenciadas

As tabelas em um catálogo do Spark, incluindo tabelas do Delta Lake, podem ser gerenciadas ou externas. É importante entender a distinção entre esses tipos de tabela.

  • Uma tabela gerenciada é definida sem um local especificado, e os arquivos de dados são gravados no armazenamento usado pelo metastore. A remoção da tabela não apenas remove os metadados dela do catálogo, mas também exclui a pasta na qual os arquivos de dados da tabela estão armazenados.
  • Uma tabela externa é definida para um local de arquivo personalizado, onde os dados da tabela são armazenados. Os metadados da tabela são definidos no catálogo do Spark. Remover a tabela exclui os metadados do catálogo, mas não afeta os arquivos de dados.

Criar tabelas de catálogo

Existem várias maneiras de criar tabelas de catálogo.

Criar uma tabela de catálogo com base em um dataframe

Você pode criar tabelas gerenciadas escrevendo um dataframe usando a operação saveAsTable, conforme mostrado nos seguintes exemplos:

# Save a dataframe as a managed table
df.write.format("delta").saveAsTable("MyManagedTable")

## specify a path option to save as an external table
df.write.format("delta").option("path", "/mydata").saveAsTable("MyExternalTable")

Criar uma tabela de catálogo usando SQL

Você também pode criar uma tabela de catálogo usando a instrução SQL CREATE TABLE com a cláusula USING DELTA e um parâmetro opcional LOCATION para tabelas externas. Você pode executar a instrução usando a API SparkSQL, como o seguinte exemplo:

spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")

Como alternativa, você pode usar o suporte de SQL nativo no Spark para executar a instrução:

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

Dica

A instrução CREATE TABLE retornará um erro se uma tabela com o nome especificado já existir no catálogo. Para atenuar esse comportamento, você pode usar uma instrução CREATE TABLE IF NOT EXISTS ou a instrução CREATE OR REPLACE TABLE.

Definir o esquema de tabela

Em todos os exemplos até agora, a tabela é criada sem um esquema explícito. No caso de tabelas criadas escrevendo um dataframe, o esquema de tabela é herdado do dataframe. Ao criar uma tabela externa, o esquema é herdado de todos os arquivos armazenados atualmente no local da tabela. No entanto, ao criar uma tabela gerenciada ou uma tabela externa com um local vazio no momento, você define o esquema da tabela especificando os nomes de coluna, os tipos e a nulidade como parte da instrução CREATE TABLE; conforme mostrado no seguinte exemplo:

%%sql

CREATE TABLE ManagedSalesOrders
(
    Orderid INT NOT NULL,
    OrderDate TIMESTAMP NOT NULL,
    CustomerName STRING,
    SalesTotal FLOAT NOT NULL
)
USING DELTA

Ao usar o Delta Lake, os esquemas de tabela são impostos – todas as inserções e atualizações precisam estar em conformidade com os tipos de dados e a nulidade da coluna especificados.

Usando a API DeltaTableBuilder

Você pode usar a API DeltaTableBuilder (parte da API do Delta Lake) para criar uma tabela de catálogo, conforme mostrado no seguinte exemplo:

from delta.tables import *

DeltaTable.create(spark) \
  .tableName("default.ManagedProducts") \
  .addColumn("Productid", "INT") \
  .addColumn("ProductName", "STRING") \
  .addColumn("Category", "STRING") \
  .addColumn("Price", "FLOAT") \
  .execute()

Da mesma forma que a instrução SQL CREATE TABLE, o método create retornará um erro se já existir uma tabela com o nome especificado. Você pode atenuar esse comportamento usando o método createIfNotExists ou o método createOrReplace.

Usar tabelas de catálogo

Você pode usar tabelas de catálogo como tabelas em qualquer banco de dados relacional baseado em SQL, consultando e manipulando-as usando instruções de SQL padrão. Por exemplo, o seguinte exemplo de código usa uma instrução SELECT para consultar a tabela ManagedSalesOrders:

%%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

Dica

Para obter mais informações sobre como trabalhar com o Delta Lake, confira Leituras e gravações em lotes de tabela na documentação do Delta Lake.