Работа с внешними таблицами

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

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

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

Когда следует использовать внешние таблицы

Databricks рекомендует использовать внешние таблицы для следующих вариантов использования:

  • Необходимо зарегистрировать таблицу, поддерживаемую существующими данными, которые несовместимы с управляемыми таблицами каталога Unity, такими как JSON или Avro. См. форматы файлов для внешних таблиц.
  • Вам нужен прямой доступ к данным из клиентов, отличных от Databricks, которые не поддерживают другие шаблоны внешнего доступа. Привилегии каталога Unity не применяются при доступе пользователей к файлам данных из внешних систем. См. как получить доступ к данным Databricks с помощью внешних систем.

В большинстве случаев Databricks рекомендует использовать управляемые таблицы каталога Unity , чтобы воспользоваться преимуществами автоматической оптимизации таблиц, повышения производительности запросов и снижения затрат. Чтобы перенести внешние таблицы в управляемые таблицы, см. раздел Преобразование внешних или сторонних таблиц Delta Lake в управляемые таблицы Unity Catalog.

Это важно

Если вы обновляете метаданные внешней таблицы, используя клиент, не связанный с Databricks, или осуществляете доступ на основе пути внутри Databricks, состояние этих метаданных не синхронизируется автоматически с каталогом Unity. Databricks не рекомендует такие обновления метаданных, но если вы их выполняете, необходимо выполнить команду MSCK REPAIR TABLE <table-name> SYNC METADATA, чтобы привести схему в каталоге Unity в актуальное состояние. См. REPAIR TABLE.

Форматы файлов для внешних таблиц

Внешние таблицы могут использовать следующие форматы файлов:

  • ДЕЛЬТА
  • CSV
  • JSON (JavaScript Object Notation)
  • AVRO;
  • PARQUET;
  • ОРК (Оптическое Распознавание Символов)
  • ТЕКСТ

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

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

Перед началом работы

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

Дополнительные сведения о настройке внешних расположений см. в разделе Подключение к внешнему расположению Azure Data Lake Storage 2-го поколения (ADLS 2-го поколения).

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

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

Замечание

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

Примеры

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

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

  • <catalog>: имя каталога, содержащего таблицу.
  • <schema>: имя схемы, содержащей таблицу.
  • <table-name>: это имя для таблицы.
  • <column-name> и <data-type>: имя и тип данных для каждого столбца.
  • <bucket-path>: путь к контейнеру облачного хранилища, в котором будет создана таблица.
  • <table-directory>: каталог, в котором будет создана таблица. Используйте уникальный каталог для каждой таблицы.
  • <source-table>: таблица, используемая в качестве источника данных при создании таблицы из результатов запроса.

SQL

Чтобы создать внешнюю таблицу в ADLS 2-го поколения с определенной схемой, выполните следующую команду:

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

Чтобы создать внешнюю таблицу в ADLS 2-го поколения из результатов запроса, выполните следующее:

CREATE TABLE <catalog>.<schema>.<table-name>
LOCATION 'abfss://<bucket-path>/<table-directory>'
AS SELECT * FROM <source-table>;

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

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

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

CREATE TABLE <catalog>.<schema>.<table-name>
LOCATION 's3://<bucket-path>/<table-directory>'
AS SELECT * FROM <source-table>;

Python

Чтобы создать внешнюю таблицу в ADLS 2-го поколения с определенной схемой, выполните следующую команду:

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([StructField("<column-name>", <data-type>())])

spark.createDataFrame([], schema).write \
  .option("path", "abfss://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Чтобы создать внешнюю таблицу в ADLS Gen2 из DataFrame, выполните следующие действия:

df.write \
  .option("path", "abfss://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

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

from pyspark.sql.types import StructType, StructField, StringType

schema = StructType([StructField("<column-name>", <data-type>())])

spark.createDataFrame([], schema).write \
  .option("path", "s3://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Чтобы создать внешнюю таблицу в S3 из DataFrame, выполните следующее:

df.write \
  .option("path", "s3://<bucket-path>/<table-directory>") \
  .saveAsTable("<catalog>.<schema>.<table-name>")

Дополнительные сведения о параметрах создания таблиц см. в CREATE TABLE.

Следующие параметры синтаксиса SQL работают с операциями DataFrame:

Удалите внешнюю таблицу

Чтобы удалить таблицу, вы должны быть её владельцем или иметь привилегию MANAGE на таблице. Чтобы удалить внешнюю таблицу, выполните следующую команду:

SQL

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

Python

spark.sql("DROP TABLE IF EXISTS catalog_name.schema_name.table_name")

Кроме того, в Databricks Runtime 18.2 и более поздних версиях используйте spark.catalog.dropTable():

spark.catalog.dropTable("catalog_name.schema_name.table_name", ifExists=True)

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

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

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

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

Получите ноутбук