Таблицы общих метаданных Azure Synapse Analytics

Служба Azure Synapse Analytics позволяет различным вычислительным системам рабочих областей использовать базы данных и таблицы совместно с пулами Apache Spark и бессерверным пулом SQL.

После того как задание Spark создаст базу данных, в ней можно с помощью Spark создать таблицы с форматом хранения Parquet, Delta или CSV. Имена таблиц будут преобразованы в нижний регистр, и их нужно будет запрашивать с использованием нижнего регистра. Эти таблицы немедленно становятся доступными для выполнения запросов через любой пул Spark в рабочей области Azure Synapse. Их также можно использовать из любого задания Spark при наличии соответствующих разрешений.

Таблицы, создаваемые и управляемые в Spark, а также внешние таблицы Spark доступны как внешние таблицы с тем же именем в соответствующей синхронизированной базе данных в бессерверном пуле SQL. Дополнительные сведения можно найти в разделе Exposing a Spark table in SQL (Предоставление таблицы Spark в SQL).

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

Управление созданной в Spark таблицей

Используйте Spark для управления созданными в Spark базами данных. Например, можно удалить таблицу из задания бессерверного пула Apache Spark или создать в ней таблицы средствами Spark.

Объекты в синхронизированных базах данных не могут быть изменены из бессерверного пула SQL.

Предоставление таблицы Spark в SQL

Общие таблицы Spark

Spark предоставляет два типа таблиц, которые Azure Synapse автоматически делает доступными в SQL.

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

    Spark предоставляет множество форматов для хранения данных в управляемых таблицах, в том числе TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA и LIBSVM. Обычно эти файлы размещаются в каталоге warehouse, где хранятся данные управляемой таблицы.

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

    Spark также предлагает возможности для создания внешних таблиц на основе существующих данных: вы можете указать параметр LOCATION или использовать формат Hive. Такие внешние таблицы могут иметь разные форматы данных, включая Parquet.

В настоящее время Azure Synapse предоставляет в совместное использование для подсистем SQL только те управляемые и внешние таблицы Spark, данные в которых хранятся в формате Parquet, DELTA или CSV. Таблицы на основе других форматов не синхронизируются автоматически. Но вы можете явным образом включить для базы данных SQL синхронизацию таких таблиц во внешнюю таблицу, если подсистема SQL поддерживает базовый формат таблицы.

Примечание

В настоящее время в бессерверном пуле SQL полностью поддерживаются только форматы Parquet и CSV. Таблицы Spark Delta также доступны в бессерверном пуле SQL, однако эта функция доступна в виде общедоступной предварительной версии. Внешние таблицы, созданные в Spark, недоступны в выделенных базах данных пула SQL.

Совместное использование таблиц Spark

Управляемые и внешние таблицы Spark предоставляются в ядре SQL для совместного использования как внешние таблицы со следующими свойствами:

  • источником данных внешней таблицы SQL считается тот источник данных, который представляет папку с этой таблицей Spark;
  • для внешней таблицы SQL используется формат файлов Parquet, Delta или CSV;
  • для учетных данных внешней таблицы SQL используется сквозная аутентификация.

Так как все имена таблиц Spark являются допустимыми именами таблиц в SQL, а все имена столбцов Spark являются допустимыми именами столбцов в SQL, для внешней таблицы SQL сохраняются все имена таблиц и столбцов Spark.

Типы данных в таблицах Spark отличаются от типов данных в подсистемах Synapse SQL. В следующей таблице указаны сопоставления между типами данных в таблице Spark и в SQL.

Тип данных Spark Тип данных SQL Комментарии
LongType, long, bigint bigint Spark: LongType представляет 8-байтовое целое число со знаком.
SQL: см. типы данных int, bigint, smallint и tinyint.
BooleanType, boolean bit (Parquet), varchar(6) (CSV) Spark: логический.
SQL: см. [/sql/t-sql/data-types/bit-transact-sql).
DecimalType, decimal, dec, numeric decimal Spark: DecimalType представляет десятичные числа произвольной точности. Внутреннее резервное копирование по java.math.BigDecimal. BigDecimal состоит из немасштабируемого целого числа произвольной точности и 32-разрядного целого числа.
SQL: числа с фиксированной точностью и масштабом. При использовании максимальной точности числа могут принимать значения в диапазоне от -10^38+1 до 10^38-1. Синонимами типа decimal по стандарту ISO являются типы dec и dec(p, s) . Тип numeric функционально эквивалентен типу decimal. См. decimal и numeric.
IntegerType, Integer, int int SparkIntegerType представляет собой 4-байтовые целые числа со знаком.
SQL: см. типы данных int, bigint, smallint и tinyint.
ByteType, Byte, tinyint smallint Spark: ByteType представляет 1-байтовые целые числа со знаком [от –128 до 127] и ShortType — 2-байтовые целые числа со знаком [от –32768 до 32767].
SQL: Tinyint представляет 1-байтовые целые числа со знаком [0, 255], и ShortType представляет 2-байтовые целые числа со знаком [от –32768 до 32767]. См. типы данных int, bigint, smallint и tinyint.
ShortType, Short, smallint smallint То же, что и выше.
DoubleType, Double float Spark: DoubleType представляет 8-байтовое число двойной точности с плавающей точкой. SQL: см. типы данных float и real.
FloatType, float, real real Spark: FloatType представляет 4-байтовое число двойной точности с плавающей точкой. SQL: см. типы данных float и real.
DateType, date date Spark: DateType представляет значения, содержащие значения полей "год", "месяц" и "день", без часового пояса.
SQL: см. тип данных date.
TimestampType, timestamp datetime2 Spark: TimestampType представляет значения, содержащие значения полей "год", "месяц", "день", "час", "минута" и "секунда", с локальным часовым поясом для сеанса. Значение метки времени представляет собой абсолютную точку во времени.
SQL: см. тип данных datetime2.
char char
StringType, String, varchar Varchar(n) Spark: StringType представляет значения строки символов. VarcharType(n) — это вариант StringType с ограничением по длине. Если длина входной строки превышает ограничение по длине, запись данных завершится ошибкой. Этот тип может использоваться только в схеме таблицы, а не в функциях или операторах.
CharType(n) — это вариант VarcharType(n) с фиксированной длиной. При чтении столбца типа CharType (n) всегда возвращаются строковые значения длиной n. Сравнение столбцов типа CharType(n) будет заполнять короткий символ на большую длину строки.
SQL. Если в Spark указана длина, n в varchar (n) будет соответствовать этой длине. Если это секционированный столбец, n может быть максимум 2048. В противном случае будет задано varchar(max). См. типы данных char и varchar.
Используйте его с параметрами сортировки Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL. Если в Spark указана длина, n в Varbinary(n) будет соответствовать этой длине. Если это секционированный столбец, n может быть максимум 2048. В противном случае будет задано Varbinary(max). См. типы данных binary и varbinary.
array, map, struct varchar(max) SQL: сериализуется в JSON с параметрами сортировки Latin1_General_100_BIN2_UTF8. См. раздел данные JSON.

Примечание

Параметры сортировки уровня базы данных — Latin1_General_100_CI_AS_SC_UTF8.

Модель безопасности

Базы данных и таблицы Spark, а также их синхронизированные представления в ядре SQL защищаются на уровне базового хранилища. Так как в настоящее время для них не поддерживаются разрешения на уровне объекта, все объекты будут доступны для просмотра в обозревателе объектов.

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

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

Дополнительные сведения о настройке разрешений для папок и файлов общей базы данных в Azure Synapse Analytics см. в этой статье.

Примеры

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

В этом сценарии существует база данных Spark с именем mytestdb. См. раздел Создание базы данных Spark и подключение к ней с помощью бессерверного пула SQL.

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

    CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet

Эта команда создает таблицу myparquettable в базе данных mytestdb. Имена таблиц будут преобразованы в нижний регистр. После короткой задержки вы увидите таблицу в бессерверном пуле SQL. Например, выполните следующую инструкцию из бессерверного пула SQL.

    USE mytestdb;
    SELECT * FROM sys.tables;

Убедитесь, что myparquettable есть в результатах.

Примечание

Если таблица использует формат хранения, отличный от Delta, Parquet или CSV, она не будет синхронизирована.

Теперь вставьте в таблицу некоторые значения из Spark, например выполнив следующие инструкции Spark на языке C# в записной книжке C#:

using Microsoft.Spark.Sql.Types;

var data = new List<GenericRow>();

data.Add(new GenericRow(new object[] { 1, "Alice", new Date(2010, 1, 1)}));
data.Add(new GenericRow(new object[] { 2, "Bob", new Date(1990, 1, 1)}));

var schema = new StructType
    (new List<StructField>()
        {
            new StructField("id", new IntegerType()),
            new StructField("name", new StringType()),
            new StructField("birthdate", new DateType())
        }
    );

var df = spark.CreateDataFrame(data, schema);
df.Write().Mode(SaveMode.Append).InsertInto("mytestdb.myparquettable");

Теперь вы можете считывать данные из бессерверного пула SQL следующим образом:

SELECT * FROM mytestdb.dbo.myparquettable WHERE name = 'Alice';

В качестве результата возвращается следующая строка:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

Создание внешней таблицы в Spark и обращение к ней из бессерверного пула SQL

В этом примере вы создаете внешнюю таблицу Spark на основе файлов данных Parquet, полученных в предыдущем примере для управляемой таблицы.

Например, выполните такой код SparkSQL:

CREATE TABLE mytestdb.myexternalparquettable
    USING Parquet
    LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"

Замените заполнитель <storage-name> именем используемой учетной записи хранения ADLS 2-го поколения, <fs> именем используемой вами файловой системы, а заполнитель <synapse_ws> —именем рабочей области Azure Synapse, используемой вами для выполнения этого примера.

Приведенный выше пример создает таблицу myextneralparquettable в базе данных mytestdb. После короткой задержки вы увидите таблицу в бессерверном пуле SQL. Например, выполните следующую инструкцию из бессерверного пула SQL.

USE mytestdb;
SELECT * FROM sys.tables;

Убедитесь, что myexternalparquettable есть в результатах.

Теперь вы можете считывать данные из бессерверного пула SQL следующим образом:

SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';

В качестве результата возвращается следующая строка:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

Дальнейшие действия