Таблицы общих метаданных 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 |
Spark IntegerType представляет 4 байтовых целочисленных числа со знаком. SQL: см. типы данных int, bigint, smallint и tinyint. |
ByteType , , Byte tinyint |
smallint |
Spark: ByteType представляет 1 байтовые целочисленные числа со знаком [-128–127], а ShortType представляет 2 байтовых целочисленных числа [-32768 до 32767]. SQL: Tinyint представляет 1 байтовое целое число со знаком [0, 255] и 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