Поделиться через


Созданные столбцы Delta Lake

Внимание

Эта функция предоставляется в режиме общедоступной предварительной версии.

Delta Lake поддерживает созданные столбцы, которые являются особым типом столбца, значения которых автоматически создаются на основе указанной пользователем функции над другими столбцами в таблице Delta. Когда вы выполняете запись в таблицу с созданными столбцами и не указываете значения для них явным образом, Delta Lake автоматически вычисляет значения. Например, можно автоматически создать столбец даты (для секционирования таблицы по дате) из столбца "Метка времени". Все операции записи в таблицу должны указывать только данные для столбца "Метка времени". Однако при явном предоставлении значений для них значения должны соответствовать ограничению (<value> <=> <generation expression>) IS TRUE или запись завершится ошибкой.

Внимание

Таблицы, созданные с созданными столбцами, имеют более высокую версию протокола записи таблиц, чем по умолчанию. Узнайте, как Azure Databricks управляет совместимостью функций Delta Lake? Чтобы понять, что такое управление версиями протоколов таблиц и что означает более высокая версия версии протокола таблицы.

Создание таблицы с созданными столбцами

В следующем примере показано создание таблицы с созданными столбцами.

SQL

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
)

Python

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()

Scala

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()

Созданные столбцы хранятся как обычные столбцы. То есть, они занимают место в хранилище.

К созданным столбцам применяются следующие ограничения.

  • Выражение поколения может использовать любые функции SQL в Spark, которые всегда возвращают тот же результат при указании одинаковых значений аргументов, за исключением следующих типов функций:
    • Определяемые пользователем функции.
    • Агрегатные функции.
    • Функции окна.
    • Функции, возвращающие несколько строк.

Delta Lake может создавать фильтры секций для запроса всякий раз, когда столбец секции определяется одним из следующих выражений:

Примечание.

Фотон требуется в Databricks Runtime 10.4 LTS и ниже. Фотон не требуется в Databricks Runtime 11.3 LTS и более поздних версиях.

  • CAST(col AS DATE) и тип col — TIMESTAMP.
  • YEAR(col) и тип col — TIMESTAMP.
  • Два столбца секции, определяемые и YEAR(col), MONTH(col), тип col — TIMESTAMP.
  • Три столбца секции, определяемые и YEAR(col), MONTH(col), DAY(col), тип col — TIMESTAMP.
  • Четыре столбца секции, определяемые и YEAR(col), MONTH(col), DAY(col), HOUR(col), тип col — TIMESTAMP.
  • SUBSTRING(col, pos, len) и тип col — STRING.
  • DATE_FORMAT(col, format) и тип col — TIMESTAMP.
    • Форматы дат можно использовать только со следующими шаблонами: yyyy-MM и yyyy-MM-dd-HH.
    • В Databricks Runtime 10.4 LTS и более поздних версиях можно также использовать следующий шаблон: yyyy-MM-dd

Если столбец секции определен одним из предыдущих выражений, а запрос фильтрует данные с использованием базового столбца выражения генерации, Delta Lake просматривает взаимосвязь между базовым столбцом и сгенерированным столбцом и заполняет фильтры секции на основе сгенерированного столбца раздела, если это возможно. Например, рассмотрим следующую таблицу.

CREATE TABLE events(
eventId BIGINT,
data STRING,
eventType STRING,
eventTime TIMESTAMP,
eventDate date GENERATED ALWAYS AS (CAST(eventTime AS DATE))
)
PARTITIONED BY (eventType, eventDate)

При выполнении следующего запроса:

SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"

Delta Lake автоматически создает фильтр секций, чтобы предыдущий запрос только считывал данные в секции date=2020-10-01, даже если фильтр секции не указан.

Рассмотрим другую таблицу.

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)

При выполнении следующего запроса:

SELECT * FROM events
WHERE eventTime >= "2020-10-01 00:00:00" <= "2020-10-01 12:00:00"

Delta Lake автоматически создает фильтр секций, чтобы предыдущий запрос только считывал данные в секции year=2020/month=10/day=01, даже если фильтр секции не указан.

Вы можете использовать предложение EXPLAIN и проверить предоставленный план, чтобы узнать, создает ли Delta Lake все фильтры секций автоматически.

Использование столбцов удостоверений в Delta Lake

Внимание

Объявление столбца удостоверений в таблице Delta отключает одновременные транзакции. Используйте только столбцы удостоверений в случаях использования, когда одновременные записи в целевую таблицу не требуются.

Столбцы удостоверений Delta Lake — это тип созданного столбца, который назначает уникальные значения для каждой записи, вставленной в таблицу. В следующем примере показан базовый синтаксис для объявления столбца удостоверения во время инструкции создания таблицы:

SQL

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)
 )

Python

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()

Scala

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()

Примечание.

Api Scala и Python для столбцов удостоверений доступны в Databricks Runtime 16.0 и выше.

Чтобы просмотреть все параметры синтаксиса SQL для создания таблиц с столбцами удостоверений, см. статью CREATE TABLE [USING].

При необходимости можно указать следующее:

  • Начальное значение.
  • Размер шага, который может быть положительным или отрицательным.

Начальное значение и размер шага по умолчанию 1. Невозможно указать размер 0шага.

Значения, назначенные столбцами удостоверений, являются уникальными и увеличиваются в направлении указанного шага, а также в нескольких из указанных размеров шага, но не гарантируются непрерывными. Например, с начальным значением 0 и размером 2шага все значения являются положительными даже числами, но некоторые даже числа могут быть пропущены.

При использовании предложения GENERATED BY DEFAULT AS IDENTITYоперации вставки могут указывать значения для столбца удостоверений. Измените предложение, чтобы переопределить GENERATED ALWAYS AS IDENTITY возможность вручную задать значения.

Столбцы удостоверений поддерживают BIGINT только тип, а операции завершаются ошибкой, если назначенное значение превышает диапазон, поддерживаемый BIGINT.

Сведения о синхронизации значений столбцов удостоверений с данными см. в статье ALTER TABLE ... Предложение COLUMN.

Столбцы CTAS и идентификаторов

Невозможно определить ограничения схемы, столбцов удостоверений или другие спецификации таблицы при использовании CREATE TABLE table_name AS SELECT инструкции CTAS.

Чтобы создать таблицу с столбцом удостоверений и заполнить ее существующими данными, сделайте следующее:

  1. Создайте таблицу с правильной схемой, включая определение столбца удостоверений и другие свойства таблицы.
  2. INSERT Выполните операцию.

В следующем примере ключевое DEFAULT слово используется для определения столбца удостоверения. Если данные, вставляемые в таблицу, содержат допустимые значения для столбца удостоверений, эти значения используются.

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;

Ограничения столбцов удостоверений

При работе со столбцами удостоверений существуют следующие ограничения:

  • Одновременные транзакции не поддерживаются в таблицах с включенными столбцами удостоверений.
  • Нельзя секционирование таблицы по столбцу удостоверений.
  • Нельзя использовать ALTER TABLE ADDдля столбца REPLACEудостоверений или CHANGE столбца удостоверений.
  • Нельзя обновить значение столбца удостоверений для существующей записи.

Примечание.

Чтобы изменить IDENTITY значение существующей записи, необходимо удалить запись и INSERT в качестве новой записи.