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


Таблицы метаданных, общие для 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. См. десятичное и числовое.
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], a smallint - знаковое целое число размером 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.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

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

  • Узнайте больше об общих метаданнах Azure Synapse Analytics.
  • Узнайте больше об общей базе метаданных Azure Synapse Analytics.