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


Таблицы общих метаданных 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, , longbigint 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, , decimaldecnumeric 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, , Integerint int Spark IntegerType представляет 4 байтовых целочисленных числа со знаком.
SQL: см. типы данных int, bigint, smallint и tinyint.
ByteType, , Bytetinyint smallint Spark: ByteType представляет 1 байтовые целочисленные числа со знаком [-128–127], а ShortType представляет 2 байтовых целочисленных числа [-32768 до 32767].
SQL: Tinyint представляет 1 байтовое целое число со знаком [0, 255] и smallint представляет 2 байтовых целочисленных числа [-32768, 32767]. См. типы данных int, bigint, smallint и tinyint.
ShortType, , Shortsmallint smallint То же, что выше.
DoubleType, Double float Spark: DoubleType представляет 8-байтовое число двойной точности с плавающей точкой. SQL: см. типы данных float и real.
FloatType, , floatreal real Spark: FloatType представляет 4-байтовое число двойной точности с плавающей точкой. SQL: см. типы данных float и real.
DateType, date date Spark: DateType представляет значения, содержащие значения полей года, месяца и дня без часового пояса.
SQL: см. тип данных date.
TimestampType, timestamp datetime2 Spark: TimestampType представляет значения, содержащие значения полей "год", "месяц", "день", "час", "минута" и "секунда", с локальным часовым поясом для сеанса. Значение метки времени представляет собой абсолютную точку во времени.
SQL: см. тип данных datetime2.
char char
StringType, , Stringvarchar 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, , mapstruct 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.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

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