evento
Junte-se a nós na FabCon Vegas
31/03, 23 - 2/04, 23
O melhor evento liderado pela comunidade Microsoft Fabric, Power BI, SQL e AI. 31 de março a 2 de abril de 2025.
Registe-se hoje mesmoEste browser já não é suportado.
Atualize para o Microsoft Edge para tirar partido das mais recentes funcionalidades, atualizações de segurança e de suporte técnico.
Importante
Esta funcionalidade está em Pré-visualização Pública.
Delta Lake suporta colunas geradas que são um tipo especial de coluna cujos valores são gerados automaticamente com base em uma função especificada pelo usuário sobre outras colunas na tabela Delta. Quando você grava em uma tabela com colunas geradas e não fornece explicitamente valores para elas, o Delta Lake calcula automaticamente os valores. Por exemplo, você pode gerar automaticamente uma coluna de data (para particionar a tabela por data) a partir da coluna de carimbo de data/hora; Todas as gravações na tabela precisam apenas especificar os dados para a coluna de carimbo de data/hora. No entanto, se você fornecer explicitamente valores para eles, os valores devem satisfazer a restrição (<value> <=> <generation expression>) IS TRUE
ou a gravação falhará com um erro.
Importante
As tabelas criadas com colunas geradas têm uma versão do protocolo de gravador de tabelas mais alta do que o padrão. Consulte Como o Azure Databricks gerencia a compatibilidade de recursos Delta Lake? para entender o controle de versão do protocolo de tabela e o que significa ter uma versão superior de uma versão de protocolo de tabela.
O exemplo a seguir mostra como criar uma tabela com colunas geradas:
CREATE TABLE default.people10m (
id INT,
firstName STRING,
middleName STRING,
lastName STRING,
gender STRING,
birthDate TIMESTAMP,
dateOfBirth DATE GENERATED ALWAYS AS (CAST(birthDate AS DATE)),
ssn STRING,
salary INT
)
DeltaTable.create(spark) \
.tableName("default.people10m") \
.addColumn("id", "INT") \
.addColumn("firstName", "STRING") \
.addColumn("middleName", "STRING") \
.addColumn("lastName", "STRING", comment = "surname") \
.addColumn("gender", "STRING") \
.addColumn("birthDate", "TIMESTAMP") \
.addColumn("dateOfBirth", DateType(), generatedAlwaysAs="CAST(birthDate AS DATE)") \
.addColumn("ssn", "STRING") \
.addColumn("salary", "INT") \
.execute()
DeltaTable.create(spark)
.tableName("default.people10m")
.addColumn("id", "INT")
.addColumn("firstName", "STRING")
.addColumn("middleName", "STRING")
.addColumn(
DeltaTable.columnBuilder("lastName")
.dataType("STRING")
.comment("surname")
.build())
.addColumn("lastName", "STRING", comment = "surname")
.addColumn("gender", "STRING")
.addColumn("birthDate", "TIMESTAMP")
.addColumn(
DeltaTable.columnBuilder("dateOfBirth")
.dataType(DateType)
.generatedAlwaysAs("CAST(dateOfBirth AS DATE)")
.build())
.addColumn("ssn", "STRING")
.addColumn("salary", "INT")
.execute()
As colunas geradas são armazenadas como se fossem colunas normais. Ou seja, ocupam armazenamento.
As seguintes restrições aplicam-se às colunas geradas:
O Delta Lake pode gerar filtros de partição para uma consulta sempre que uma coluna de partição é definida por uma das seguintes expressões:
Nota
O Photon é necessário no Databricks Runtime 10.4 LTS e inferior. O Photon não é necessário no Databricks Runtime 11.3 LTS e superior.
CAST(col AS DATE)
e o tipo de col
é TIMESTAMP
.YEAR(col)
e o tipo de col
é TIMESTAMP
.YEAR(col), MONTH(col)
e o tipo de col
é TIMESTAMP
.YEAR(col), MONTH(col), DAY(col)
e o tipo de col
é TIMESTAMP
.YEAR(col), MONTH(col), DAY(col), HOUR(col)
e o tipo de col
é TIMESTAMP
.SUBSTRING(col, pos, len)
e o tipo de col
STRING
DATE_FORMAT(col, format)
e o tipo de col
é TIMESTAMP
.
yyyy-MM
e yyyy-MM-dd-HH
.yyyy-MM-dd
.Se uma coluna de partição for definida por uma das expressões anteriores e uma consulta filtrar dados usando a coluna base subjacente de uma expressão de geração, o Delta Lake examinará a relação entre a coluna base e a coluna gerada e preencherá os filtros de partição com base na coluna de partição gerada, se possível. Por exemplo, dada a seguinte tabela:
CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)
Se você executar a seguinte consulta:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"
O Delta Lake gera automaticamente um filtro de partição para que a consulta anterior leia apenas os dados na partição date=2020-10-01
, mesmo que um filtro de partição não seja especificado.
Como outro exemplo, dada a seguinte tabela:
CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
year INT GENERATED ALWAYS AS (YEAR(eventTime)),
month INT GENERATED ALWAYS AS (MONTH(eventTime)),
day INT GENERATED ALWAYS AS (DAY(eventTime))
)
PARTITIONED BY (eventType, year, month, day)
Se você executar a seguinte consulta:
SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"
O Delta Lake gera automaticamente um filtro de partição para que a consulta anterior leia apenas os dados na partição year=2020/month=10/day=01
, mesmo que um filtro de partição não seja especificado.
Você pode usar uma cláusula EXPLAIN e verificar o plano fornecido para ver se o Delta Lake gera automaticamente filtros de partição.
Importante
Declarar uma coluna de identidade em uma tabela Delta desabilita transações simultâneas. Use colunas de identidade apenas em casos de uso em que gravações simultâneas na tabela de destino não são necessárias.
As colunas de identidade Delta Lake são um tipo de coluna gerada que atribui valores exclusivos para cada registro inserido em uma tabela. O exemplo a seguir mostra a sintaxe básica para declarar uma coluna de identidade durante uma instrução create table:
CREATE TABLE table_name (
id_col1 BIGINT GENERATED ALWAYS AS IDENTITY,
id_col2 BIGINT GENERATED ALWAYS AS IDENTITY (START WITH -1 INCREMENT BY 1),
id_col3 BIGINT GENERATED BY DEFAULT AS IDENTITY,
id_col4 BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH -1 INCREMENT BY 1)
)
from delta.tables import DeltaTable, IdentityGenerator
from pyspark.sql.types import LongType
DeltaTable.create()
.tableName("table_name")
.addColumn("id_col1", dataType=LongType(), generatedAlwaysAs=IdentityGenerator())
.addColumn("id_col2", dataType=LongType(), generatedAlwaysAs=IdentityGenerator(start=-1, step=1))
.addColumn("id_col3", dataType=LongType(), generatedByDefaultAs=IdentityGenerator())
.addColumn("id_col4", dataType=LongType(), generatedByDefaultAs=IdentityGenerator(start=-1, step=1))
.execute()
import io.delta.tables.DeltaTable
import org.apache.spark.sql.types.LongType
DeltaTable.create(spark)
.tableName("table_name")
.addColumn(
DeltaTable.columnBuilder(spark, "id_col1")
.dataType(LongType)
.generatedAlwaysAsIdentity().build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col2")
.dataType(LongType)
.generatedAlwaysAsIdentity(start = -1L, step = 1L).build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col3")
.dataType(LongType)
.generatedByDefaultAsIdentity().build())
.addColumn(
DeltaTable.columnBuilder(spark, "id_col4")
.dataType(LongType)
.generatedByDefaultAsIdentity(start = -1L, step = 1L).build())
.execute()
Nota
As APIs Scala e Python para colunas de identidade estão disponíveis no Databricks Runtime 16.0 e superior.
Para ver todas as opções de sintaxe SQL para criar tabelas com colunas de identidade, consulte CREATE TABLE [USING].
Opcionalmente, você pode especificar o seguinte:
O valor inicial e o tamanho da etapa são padronizados como 1
. Não é possível especificar um tamanho de etapa de 0
.
Os valores atribuídos pelas colunas de identidade são exclusivos e incrementados na direção da etapa especificada e em múltiplos do tamanho da etapa especificado, mas não é garantido que sejam contíguos. Por exemplo, com um valor inicial e um tamanho de 0
etapa de 2
, todos os valores são números pares positivos, mas alguns números pares podem ser ignorados.
Ao usar a cláusula GENERATED BY DEFAULT AS IDENTITY
, as operações de inserção podem especificar valores para a coluna de identidade. Modifique a cláusula a ser GENERATED ALWAYS AS IDENTITY
para substituir a capacidade de definir valores manualmente.
As colunas de identidade suportam apenas o tipo e as BIGINT
operações falham se o valor atribuído exceder o intervalo suportado pelo BIGINT
.
Para saber mais sobre como sincronizar valores de coluna de identidade com dados, consulte ALTER TABLE ... Cláusula COLUMN.
Não é possível definir esquema, restrições de coluna de identidade ou quaisquer outras especificações de tabela ao usar uma CREATE TABLE table_name AS SELECT
instrução (CTAS).
Para criar uma nova tabela com uma coluna de identidade e preenchê-la com dados existentes, faça o seguinte:
INSERT
operação.O exemplo a seguir usa a DEFAULT
palavra-chave para definir a coluna de identidade. Se os dados inseridos na tabela incluírem valores válidos para a coluna de identidade, esses valores serão usados.
CREATE OR REPLACE TABLE new_table (
id BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 5),
event_date DATE,
some_value BIGINT
);
-- Inserts records including existing IDs
INSERT INTO new_table
SELECT id, event_date, some_value FROM old_table;
-- Insert records and generate new IDs
INSERT INTO new_table
SELECT event_date, some_value FROM new_records;
Existem as seguintes limitações ao trabalhar com colunas de identidade:
ALTER TABLE
para ADD
, REPLACE
ou CHANGE
uma coluna de identidade.Nota
Para alterar o valor de IDENTITY
um registro existente, você deve excluir o registro e INSERT
ele como um novo registro.
evento
Junte-se a nós na FabCon Vegas
31/03, 23 - 2/04, 23
O melhor evento liderado pela comunidade Microsoft Fabric, Power BI, SQL e AI. 31 de março a 2 de abril de 2025.
Registe-se hoje mesmoFormação
Módulo
Usar o Delta Lake no Azure Synapse Analytics - Training
O Delta Lake é uma área de armazenamento relacional de código aberto para o Spark que você pode usar para implementar uma arquitetura de data lakehouse no Azure Synapse Analytics.