Создание таблиц в каталоге Unity

В этой статье описывается концепция управляемых и внешних таблиц в каталоге Unity и описывается создание таблиц в каталоге Unity.

Примечание.

При создании таблицы обязательно ссылайтесь на каталог, управляемый каталогом Unity, или задайте каталог по умолчанию для каталога, управляемого каталогом Unity. См. раздел "Управление каталогом по умолчанию".

Каталог hive_metastore отображается в каталоге Обозреватель, но не считается управляемым каталогом Unity. Он управляется хранилищем метаданных Hive рабочей области Azure Databricks. Все остальные каталоги, перечисленные в списке, управляются каталогом Unity.

Вы можете использовать интерфейс обновления таблицы каталога Unity для обновления существующих таблиц, зарегистрированных в хранилище метаданных Hive до каталога Unity. См. статью "Обновление таблиц и представлений Hive до каталога Unity".

Управляемые таблицы

Управляемые таблицы создаются в каталоге Unity по умолчанию. Каталог Unity управляет жизненным циклом и макетом файлов для этих таблиц. Не следует использовать средства за пределами Azure Databricks для управления файлами в этих таблицах напрямую.

Управляемые таблицы хранятся в управляемом хранилище в хранилище метаданных, каталоге или уровне схемы в зависимости от того, как настроена схема и каталог. См. раздел "Указание расположения управляемого хранилища" в каталоге Unity.

Управляемые таблицы всегда используют формат таблицы Delta .

При удалении управляемой таблицы ее базовые данные удаляются из облачного клиента в течение 30 дней.

Внешние таблицы

Внешние таблицы — это таблицы, данные которых хранятся вне управляемого расположения хранилища, указанного для хранилища метаданных, каталога или схемы. Используйте внешние таблицы только в том случае, если требуется прямой доступ к данным за пределами кластеров Azure Databricks или хранилищ SQL Databricks.

При выполнении команды DROP TABLE во внешней таблице каталог Unity не удаляет базовые данные. Чтобы удалить таблицу, необходимо быть ее владельцем. Вы можете управлять разрешениями в отношении внешних таблиц и использовать их в запросах так же, как и с управляемыми таблицами. Чтобы создать внешнюю таблицу с помощью SQL, укажите путь LOCATION в инструкции CREATE TABLE. Для внешних таблиц могут использоваться следующие форматы файлов:

  • РАЗНИЦА
  • CSV
  • JSON
  • AVRO;
  • PARQUET;
  • ORC
  • ТЕКСТ

Для управления доступом к базовому облачному хранилищу для внешней таблицы необходимо настроить учетные данные хранилища и внешние расположения.

Дополнительные сведения см. в разделе Создание внешней таблицы.

Требования

У вас должна быть CREATE TABLE привилегия схемы, в которой требуется создать таблицу, а также USE SCHEMA привилегии схемы и USE CATALOG привилегии родительского каталога.

Если создается внешняя таблица см. раздел Создание внешней таблицы для получения дополнительных сведений.

Создание управляемой таблицы

Чтобы создать управляемую таблицу, выполните указанную ниже команду SQL. Для создания таблицы также можно использовать пример записной книжки. Элементы в квадратных скобках являются необязательными. Замените значения-заполнители:

  • <catalog-name>: имя каталога, содержащего таблицу..

    Это не может быть hive_metastore каталог, который создается автоматически для хранилища метаданных Hive, связанного с рабочей областью Azure Databricks. Вы можете удалить имя каталога, если вы создаете таблицу в каталоге по умолчанию рабочей области.

  • <schema-name>: имя схемы, которая будет содержать таблицу..

  • <table-name>: имя таблицы.

  • <column-specification>: имя и тип данных для каждого столбца.

SQL

CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
);

Python

spark.sql("CREATE TABLE <catalog-name>.<schema-name>.<table-name> "
  "("
  "  <column-specification>"
  ")")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog-name>.<schema-name>.<table-name> ",
  "(",
  "  <column-specification>",
  ")",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog-name>.<schema-name>.<table-name> " +
  "(" +
  "  <column-specification>" +
  ")")

Вы также можете создать управляемую таблицу с помощью поставщика Databricks Terraform и databricks_table. Вы можете получить список полных имен таблиц с помощью databricks_tables.

Например, чтобы создать таблицу main.default.department и вставить в нее пять строк:

SQL

CREATE TABLE main.default.department
(
  deptcode  INT,
  deptname  STRING,
  location  STRING
);

INSERT INTO main.default.department VALUES
  (10, 'FINANCE', 'EDINBURGH'),
  (20, 'SOFTWARE', 'PADDINGTON'),
  (30, 'SALES', 'MAIDSTONE'),
  (40, 'MARKETING', 'DARLINGTON'),
  (50, 'ADMIN', 'BIRMINGHAM');

Python

spark.sql("CREATE TABLE main.default.department "
  "("
  "  deptcode  INT,"
  "  deptname  STRING,"
  "  location  STRING"
  ")"
  "INSERT INTO main.default.department VALUES "
  "  (10, 'FINANCE', 'EDINBURGH'),"
  "  (20, 'SOFTWARE', 'PADDINGTON'),"
  "  (30, 'SALES', 'MAIDSTONE'),"
  "  (40, 'MARKETING', 'DARLINGTON'),"
  "  (50, 'ADMIN', 'BIRMINGHAM')")

R

library(SparkR)

sql(paste("CREATE TABLE main.default.department ",
  "(",
  "  deptcode  INT,",
  "  deptname  STRING,",
  "  location  STRING",
  ")",
  "INSERT INTO main.default.department VALUES ",
  "  (10, 'FINANCE', 'EDINBURGH'),",
  "  (20, 'SOFTWARE', 'PADDINGTON'),",
  "  (30, 'SALES', 'MAIDSTONE'),",
  "  (40, 'MARKETING', 'DARLINGTON'),",
  "  (50, 'ADMIN', 'BIRMINGHAM')",
  sep = ""))

Scala

spark.sql("CREATE TABLE main.default.department " +
  "(" +
  "  deptcode  INT," +
  "  deptname  STRING," +
  "  location  STRING" +
  ")" +
  "INSERT INTO main.default.department VALUES " +
  "  (10, 'FINANCE', 'EDINBURGH')," +
  "  (20, 'SOFTWARE', 'PADDINGTON')," +
  "  (30, 'SALES', 'MAIDSTONE')," +
  "  (40, 'MARKETING', 'DARLINGTON')," +
  "  (50, 'ADMIN', 'BIRMINGHAM')")

Пример записной книжки: создание управляемых таблиц

Примеры записной книжки ниже можно использовать для создания каталога, схемы и управляемой таблицы, а также для управления разрешениями в отношении них.

Создание таблицы в каталоге Unity и управление ими с помощью записной книжки Python

Получить записную книжку

Создание таблицы в каталоге Unity и управление ими с помощью записной книжки SQL

Получить записную книжку

Удаление управляемой таблицы

Чтобы удалить таблицу, необходимо быть владельцем таблицы. Чтобы удалить управляемую таблицу, выполните следующую команду SQL:

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

При удалении управляемой таблицы ее базовые данные удаляются из облачного клиента в течение 30 дней.

Создание внешней таблицы

Данные во внешней таблице хранятся по пути в облачном арендаторе. Для работы с внешними таблицами каталог Unity представляет два объекта для доступа и работы с внешним облачным хранилищем:

  • Учетные данные хранилища содержат способ проверки подлинности для доступа к облачному месту хранения. Учетные данные хранилища не содержат сопоставления с путем, к которому они обеспечивают доступ. В отношении учетных данных хранилища применяются правила управления доступом, определяющие, какие именно пользователи могут работать с этими учетными данными.
  • Внешнее расположение связывает учетные данные хранилища с путем к облачному хранилищу, к которому предоставляется доступ. Внешнее расположение обеспечивает доступ только к этому пути к облачному хранилищу и его содержимому. В отношении внешних расположений применяются правила управления доступом, определяющие, какие именно пользователи могут работать с ними. Внешнее расположение используется автоматически, когда команда SQL содержит LOCATION предложение.

Требования

Чтобы создать внешнюю таблицу, необходимы:

  • CREATE EXTERNAL TABLE Привилегия во внешнем расположении, которое предоставляет доступ к LOCATION доступу к внешней таблице.
  • Разрешение USE SCHEMA для родительской схемы таблицы.
  • Разрешение USE CATALOG родительского каталога таблицы.
  • Разрешение CREATE TABLE для родительской схемы таблицы.

Внешние расположения и учетные данные хранения хранятся на уровне хранилища метаданных, а не в каталоге. Чтобы создать учетные данные хранения, необходимо быть администратором учетной записи или иметь CREATE STORAGE CREDENTIAL права. Чтобы создать внешнее расположение, необходимо быть администратором хранилища метаданных или иметь привилегию CREATE EXTERNAL LOCATION . См. Подключение в облачное хранилище объектов с помощью каталога Unity.

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

Используйте один из следующих примеров команд в записной книжке или редакторе запросов SQL для создания внешней таблицы.

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

В следующих примерах замените значения-заполнители:

  • <catalog>: имя каталога, который будет содержать таблицу.

    Это не может быть hive_metastore каталог, который создается автоматически для хранилища метаданных Hive, связанного с рабочей областью Azure Databricks. Вы можете удалить имя каталога, если вы создаете таблицу в каталоге по умолчанию рабочей области.

  • <schema>: имя схемы, которая будет содержать таблицу.

  • <table-name>: имя таблицы.

  • <column-specification>: имя и тип данных для каждого столбца.

  • <bucket-path>: Путь к контейнеру облачного хранилища, в котором будет создана таблица.

  • <table-directory>: каталог, в котором будет создана таблица. Используйте уникальный каталог для каждой таблицы.

Внимание

После создания таблицы в пути пользователи больше не смогут напрямую обращаться к файлам из Azure Databricks, даже если они получили права на внешнее расположение или учетные данные хранилища для этого. Благодаря этому пользователи не могут обойти правила управления доступом к таблицам, считывая файлы из облачного арендатора напрямую.

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-specification>
)
LOCATION 'abfss://<bucket-path>/<table-directory>';

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "("
  "  <column-specification>"
  ") "
  "LOCATION 'abfss://<bucket-path>/<table-directory>'")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "(",
  "  <column-specification>",
  ") ",
  "LOCATION 'abfss://<bucket-path>/<table-directory>'",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "(" +
  "  <column-specification>" +
  ") " +
  "LOCATION 'abfss://<bucket-path>/<table-directory>'")

Каталог Unity проверяет наличие у вас следующих разрешений:

  • CREATE EXTERNAL TABLE для внешнего расположения, которое ссылается на указанный вами путь к облачному хранилищу.
  • CREATE TABLE для родительской схемы.
  • USE SCHEMA для родительской схемы.
  • USE CATALOG для родительского каталога.

При этом создается внешняя таблица. В противном случае возникает ошибка и внешняя таблица не создается.

Примечание.

Вместо этого вы можете перенести существующую внешнюю таблицу в хранилище метаданных Hive в каталоге Unity без дублирования данных. См. статью Об обновлении одной таблицы Hive до внешней таблицы каталога Unity с помощью мастера обновления.

Вы также можете создать внешнюю таблицу с помощью поставщика Databricks Terraform и databricks_table. Вы можете получить список полных имен таблиц с помощью databricks_tables.

Пример записной книжки: создание внешних таблиц

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

Создание внешней таблицы и управление ими в записной книжке каталога Unity

Получить записную книжку

Создание таблицы из файлов, хранящихся в облачном арендаторе

Вы можете заполнить управляемую или внешнюю таблицу записями из файлов, хранящихся в облачном арендаторе. Каталог Unity считывает файлы в этом расположении и вставляет их содержимое в таблицу. В каталоге Unity это называется доступом на основе пути.

Вы можете следовать примерам в этом разделе или использовать пользовательский интерфейс добавления данных.

Просмотр содержимого файлов

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

Необходимые разрешения: необходимо иметь READ FILES разрешение на внешнее расположение, связанное с путьом к облачному хранилищу, чтобы вернуть список файлов данных в этом расположении.

SQL

  1. Получите список файлов для пути к облачному хранилищу:

    LIST 'abfss://<path-to-files>';
    
  2. Запросите данные в файлах по указанному пути:

    SELECT * FROM <format>.`abfss://<path-to-files>`;
    

Python

  1. Получите список файлов для пути к облачному хранилищу:

    display(spark.sql("LIST 'abfss://<path-to-files>'"))
    
  2. Запросите данные в файлах по указанному пути:

    display(spark.read.load("abfss://<path-to-files>"))
    

R

  1. Получите список файлов для пути к облачному хранилищу:

    library(SparkR)
    
    display(sql("LIST 'abfss://<path-to-files>'"))
    
  2. Запросите данные в файлах по указанному пути:

    library(SparkR)
    
    display(loadDF("abfss://<path-to-files>"))
    

Scala

  1. Получите список файлов для пути к облачному хранилищу:

    display(spark.sql("LIST 'abfss://<path-to-files>'"))
    
  2. Запросите данные в файлах по указанному пути:

    display(spark.read.load("abfss://<path-to-files>"))
    

Создание таблицы из файлов

Следуйте примерам в этом разделе, чтобы создать новую таблицу и заполнить ее файлами данных в клиенте облака.

Примечание.

Вместо этого вы можете перенести существующую внешнюю таблицу в хранилище метаданных Hive в каталоге Unity без дублирования данных. См. статью Об обновлении одной таблицы Hive до внешней таблицы каталога Unity с помощью мастера обновления.

Внимание

  • При создании таблицы таким способом путь к хранилищу считывается только один раз, чтобы предотвратить дублирование записей. Если вы хотите повторно прочитать содержимое каталога, необходимо удалить и повторно создать таблицу. Для существующей таблицы можно вставить записи из пути к хранилищу.
  • Путь к сегменту, в котором создается таблица, нельзя параллельно использовать для чтения или записи файлов данных.
  • Считываются только файлы в определенном каталоге; чтение не является рекурсивным.
  • У вас должны быть следующие разрешения:
    • USE CATALOG в родительском каталоге и USE SCHEMA схеме.
    • CREATE TABLE для родительской схемы.
    • READ FILES для внешнего расположения, связанного с путем к сегменту, где находятся файлы, или непосредственно для учетных данных хранения, если внешнее расположение не используется.
    • При создании внешней таблицы необходимо разрешение CREATE EXTERNAL TABLE для пути к контейнеру, в котором будет создана таблица.

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

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-specification>
)
SELECT * from <format>.`abfss://<path-to-files>`;

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "( "
  "  <column-specification> "
  ") "
  "SELECT * from <format>.`abfss://<path-to-files>`")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "( ",
  "  <column-specification> ",
  ") ",
  "SELECT * from <format>.`abfss://<path-to-files>`",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "( " +
  "  <column-specification> " +
  ") " +
  "SELECT * from <format>.`abfss://<path-to-files>`")

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

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
    <column-specification>
)
USING <format>
LOCATION 'abfss://<table-location>'
SELECT * from <format>.`abfss://<path-to-files>`;

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "( "
  "  <column-specification> "
  ") "
  "USING <format> "
  "LOCATION 'abfss://<table-location>' "
  "SELECT * from <format>.`abfss://<path-to-files>`")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "( ",
  "  <column-specification> ",
  ") ",
  "USING <format> ",
  "LOCATION 'abfss://<table-location>' ",
  "SELECT * from <format>.`abfss://<path-to-files>`",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "( " +
  "  <column-specification> " +
  ") " +
  "USING <format> " +
  "LOCATION 'abfss://<table-location>' " +
  "SELECT * from <format>.`abfss://<path-to-files>`")

Вставка записей из пути в существующую таблицу

Чтобы вставить записи из пути к контейнеру в существующую таблицу, используйте команду COPY INTO. В следующих примерах замените значения-заполнители:

  • <catalog>: имя родительского каталога таблицы.
  • <schema>: имя родительской схемы таблицы.
  • <path-to-files>: путь к контейнеру, который содержит файлы данных.
  • <format>: формат файлов, например delta.
  • <table-location>: путь к сегменту, в котором будет создана таблица.

Внимание

  • При вставке записей в таблицу таким способом указанный вами путь к контейнеру считывается только один раз, чтобы предотвратить дублирование записей.
  • Путь к сегменту, в котором создается таблица, нельзя параллельно использовать для чтения или записи файлов данных.
  • Считываются только файлы в определенном каталоге; чтение не является рекурсивным.
  • У вас должны быть следующие разрешения:
    • USE CATALOG в родительском каталоге и USE SCHEMA схеме.
    • MODIFY для таблицы.
    • READ FILES для внешнего расположения, связанного с путем к сегменту, где находятся файлы, или непосредственно для учетных данных хранения, если внешнее расположение не используется.
    • Чтобы вставить записи во внешнюю таблицу, требуется разрешение CREATE EXTERNAL TABLE для пути к контейнеру, в котором находится таблица.

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

SQL

COPY INTO <catalog>.<schema>.<table>
FROM (
  SELECT *
  FROM 'abfss://<path-to-files>'
)
FILEFORMAT = <format>;

Python

spark.sql("COPY INTO <catalog>.<schema>.<table> "
  "FROM ( "
  "  SELECT * "
  "  FROM 'abfss://<path-to-files>' "
  ") "
  "FILEFORMAT = <format>")

R

library(SparkR)

sql(paste("COPY INTO <catalog>.<schema>.<table> ",
  "FROM ( ",
  "  SELECT * ",
  "  FROM 'abfss://<path-to-files>' ",
  ") ",
  "FILEFORMAT = <format>",
  sep = ""))

Scala

spark.sql("COPY INTO <catalog>.<schema>.<table> " +
  "FROM ( " +
  "  SELECT * " +
  "  FROM 'abfss://<path-to-files>' " +
  ") " +
  "FILEFORMAT = <format>")

Чтобы вставить данные во внешнюю таблицу, добавьте предложение LOCATION:

SQL

COPY INTO <catalog>.<schema>.<table>
LOCATION 'abfss://<table-location>'
FROM (
  SELECT *
  FROM 'abfss://<path-to-files>'
)
FILEFORMAT = <format>;

Python

spark.sql("COPY INTO <catalog>.<schema>.<table> "
  "LOCATION 'abfss://<table-location>' "
  "FROM ( "
  "  SELECT * "
  "  FROM 'abfss://<path-to-files>' "
  ") "
  "FILEFORMAT = <format>")

R

library(SparkR)

sql(paste("COPY INTO <catalog>.<schema>.<table> ",
  "LOCATION 'abfss://<table-location>' ",
  "FROM ( ",
  "  SELECT * ",
  "  FROM 'abfss://<path-to-files>' ",
  ") ",
  "FILEFORMAT = <format>",
  sep = ""))

Scala

spark.sql("COPY INTO <catalog>.<schema>.<table> " +
  "LOCATION 'abfss://<table-location>' " +
  "FROM ( " +
  "  SELECT * " +
  "  FROM 'abfss://<path-to-files>' " +
  ") " +
  "FILEFORMAT = <format>")

Добавление комментариев в таблицу

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

  • Команда COMMENT ON . Этот параметр не поддерживает комментарии к столбцам.
  • Параметр COMMENT при использовании команд CREATE TABLE и ALTER TABLE . Этот параметр поддерживает примечания столбцов.
  • Поле комментариев "вручную" в каталоге Обозреватель. Этот параметр поддерживает примечания столбцов. См. данные документа в каталоге Обозреватель с помощью комментариев markdown.
  • Примечания, созданные ИИ (также известные как документация по искусственному интеллекту) в Обозреватель каталога. Вы можете просмотреть комментарий, предлагаемый большой языковой моделью (LLM), которая учитывает метаданные таблицы, такие как схема таблицы и имена столбцов, и изменить или принять комментарий как есть, чтобы добавить его. См. статью "Добавление комментариев, созданных ИИ" в таблицу.

Следующие шаги