Criar tabelas de catálogo
Até agora, consideramos instâncias de tabela Delta Lake criadas a partir de dataframes e modificadas por meio da API Delta Lake. Você também pode definir tabelas Delta Lake como tabelas de catálogo no metastore do Hive para seu pool do Spark e trabalhar com elas usando SQL.
Tabelas externas vs gerenciadas
As tabelas em um catálogo do Spark, incluindo as tabelas Delta Lake, podem ser gerenciadas ou externas, e é 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 armazenados no armazenamento usado pelo metastore. Soltar a tabela não só remove seus metadados do catálogo, mas também exclui a pasta na qual seus arquivos de dados 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. Soltar a tabela exclui os metadados do catálogo, mas não afeta os arquivos de dados.
Criação de tabelas de catálogo
Há várias maneiras de criar tabelas de catálogo.
Criando uma tabela de catálogo a partir de um dataframe
Você pode criar tabelas gerenciadas escrevendo um dataframe usando a operação, saveAsTable
conforme mostrado nos exemplos a seguir:
# 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")
Criando uma tabela de catálogo usando SQL
Você também pode criar uma tabela de catálogo usando a CREATE TABLE
instrução SQL com a USING DELTA
cláusula e um parâmetro opcional LOCATION
para tabelas externas. Você pode executar a instrução usando a API SparkSQL, como o exemplo a seguir:
spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")
Como alternativa, você pode usar o suporte SQL nativo no Spark para executar a instrução:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'
Gorjeta
A CREATE TABLE
instrução retornará um erro se uma tabela com o nome especificado já existir no catálogo. Para atenuar esse comportamento, você pode usar uma CREATE TABLE IF NOT EXISTS
instrução ou a CREATE OR REPLACE TABLE
instrução.
Definindo o esquema da 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 nova tabela gerenciada ou uma tabela externa com um local vazio no momento, você define o esquema da tabela especificando os nomes de coluna, tipos e anulabilidade como parte da instrução CREATE TABLE; como mostrado no exemplo a seguir:
%%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 devem estar em conformidade com a anulabilidade de coluna especificada e os tipos de dados.
Usando a API do DeltaTableBuilder
Você pode usar a API DeltaTableBuilder (parte da API Delta Lake) para criar uma tabela de catálogo, conforme mostrado no exemplo a seguir:
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 CREATE TABLE
instrução SQL, o create
método retorna um erro se uma tabela com o nome especificado já existir. Você pode atenuar esse comportamento usando o createIfNotExists
método ou createOrReplace
.
Usando tabelas de catálogo
Você pode usar tabelas de catálogo como tabelas em qualquer banco de dados relacional baseado em SQL, consultando-as e manipulando-as usando instruções SQL padrão. Por exemplo, o exemplo de código a seguir usa uma SELECT
instrução para consultar a tabela ManagedSalesOrders :
%%sql
SELECT orderid, salestotal
FROM ManagedSalesOrders
Gorjeta
Para obter mais informações sobre como trabalhar com o Delta Lake, consulte Lotes de tabela lê e grava na documentação do Delta Lake.