Tabelas de metadados compartilhados do Azure Synapse Analytics
O Azure Synapse Analytics permite que os diferentes mecanismos computacionais do workspace compartilhem bancos de dados e tabelas entre os pools do Apache Spark e o pool de SQL sem servidor.
Depois que um banco de dados for criado por um trabalho do Spark, você poderá criar tabelas nele com o Spark que usam Parquet, Delta ou CSV como o formato de armazenamento. Os nomes das tabelas serão convertidos em letras minúsculas e precisarão ser consultados usando um nome com letras minúsculas. Essas tabelas ficarão imediatamente disponíveis para consulta por qualquer um dos pools do Spark do workspace do Azure Synapse. Elas também podem ser usadas em qualquer um dos trabalhos do Spark sujeitos a permissões.
As tabelas criadas, gerenciadas e externas do Spark também são disponibilizadas como tabelas externas com o mesmo nome no banco de dados sincronizado correspondente no pool de SQL sem servidor. Como expor uma tabela do Spark no SQL fornece mais detalhes sobre a sincronização da tabela.
Como as tabelas são sincronizadas com o pool de SQL sem servidor de maneira assíncrona, haverá um pequeno atraso até que elas sejam exibidas.
Gerenciar uma tabela criada pelo Spark
Use o Spark para gerenciar bancos de dados criados pelo Spark. Por exemplo, exclua-o por meio de um trabalho do Pool do Apache Spark sem servidor e crie tabelas nele por meio do Spark.
Objetos em bancos de dados sincronizados não podem ser modificados do pool de SQL sem servidor.
Expor uma tabela do Spark no SQL
Tabelas do Spark compartilhadas
O Spark fornece dois tipos de tabelas que o Azure Synapse expõe no SQL automaticamente:
Tabelas gerenciadas
O Spark fornece muitas opções de como armazenar dados em tabelas gerenciadas, como TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA e LIBSVM. Normalmente, esses arquivos são armazenados no diretório
warehouse
, no qual os dados da tabela gerenciada são armazenados.Tabelas externas
O Spark também fornece maneiras de criar tabelas externas com base nos dados existentes, fornecendo a opção
LOCATION
ou usando o formato Hive. Essas tabelas externas podem ser criadas em uma variedade de formatos de dados, incluindo Parquet.
No momento, o Azure Synapse compartilha apenas tabelas externas e gerenciadas do Spark que armazenam os dados no formato Parquet, DELTA ou CSV com os mecanismos SQL. As tabelas com suporte de outros formatos não são sincronizadas automaticamente. Você poderá conseguir sincronizar essas tabelas explicitamente como uma tabela externa no próprio Banco de Dados SQL se o mecanismo SQL der suporte ao formato subjacente da tabela.
Observação
Atualmente, somente os formatos Parquet e CSV são sincronizados com o pool de SQL sem servidor. As tabelas Delta do Spark também estão disponíveis no pool de SQL sem servidor, mas esse recurso está em versão prévia pública. As tabelas externas criadas no Spark não estão disponíveis em bancos de dados dedicados do pool de SQL.
Compartilhar tabelas do Spark
As tabelas gerenciadas e externas do Spark compartilháveis que são expostas no mecanismo SQL como tabelas externas com as seguintes propriedades:
- A fonte de dados da tabela externa do SQL é a fonte de dados que representa a pasta de localização da tabela do Spark.
- O formato de arquivo da tabela externa do SQL é Parquet, Delta ou CSV.
- A credencial de acesso da tabela externa do SQL é passagem.
Como todos os nomes de tabelas do Spark são nomes de tabelas SQL válidos e todos os nomes de coluna do Spark são nomes de coluna SQL válidos, os nomes de tabelas e colunas do Spark serão usados para a tabela SQL externa.
As tabelas do Spark fornecem tipos de dados diferentes dos mecanismos do Synapse SQL. A seguinte tabela mapeia os tipos de dados de tabelas do Spark para os tipos SQL:
Tipo de dados do Spark | Tipo de dados SQL | Comentários |
---|---|---|
LongType , long , bigint |
bigint |
Spark:LongType representa números inteiros com sinal de oito bytes. SQL: confira int, bigint, smallint e tinyint. |
BooleanType , boolean |
bit (Parquet), varchar(6) (CSV) |
Spark: booliano. SQL: confira [/sql/t-sql/data-types/bit-transact-sql). |
DecimalType , decimal , dec , numeric |
decimal |
Spark: DecimalType representa números decimais com sinal de precisão arbitrária. Com suporte interno de java.math.BigDecimal. Um BigDecimal consiste em um valor inteiro de precisão arbitrária fora de escala e uma escala de inteiros de 32 bits. SQL: números de precisão e escala fixos. Quando a precisão máxima for usada, os valores válidos serão de - 10^38 +1 a 10^38 - 1. Os sinônimos ISO para decimal são dez e dec(p, s) . numeric é funcionalmente equivalente a decimal. Confira decimal e numérico. |
IntegerType , Integer , int |
int |
Spark: IntegerType representa números inteiros com sinal de quatro bytes. SQL: confira int, bigint, smallint e tinyint. |
ByteType , Byte , tinyint |
smallint |
Spark: ByteType representa números inteiros com sinal de um byte [-128 a 127] e ShortType representa números inteiros com sinal de dois bytes [-32768 a 32767]. SQL: Tinyint representa números inteiros com sinal de um byte [0 a 255] e smallint representa números inteiros com sinal de dois bytes [-32768 a 32767]. Confira int, bigint, smallint e tinyint. |
ShortType , Short , smallint |
smallint |
Mesmo que acima. |
DoubleType , Double |
float |
Spark: DoubleType representa um é número de ponto flutuante de oito bytes com precisão dupla. SQL: confira float e real. |
FloatType , float , real |
real |
Spark: FloatType representa números de ponto flutuante de quatro bytes com precisão dupla. SQL: confira float e real. |
DateType , date |
date |
Spark: DateType representa valores que abrangem valores de campos ano, mês e dia, sem um fuso horário. SQL: confira date. |
TimestampType , timestamp |
datetime2 |
Spark: TimestampType representa valores que abrangem valores de campos ano, mês, dia, hora, minuto e segundo, com o fuso horário local da sessão. O valor do carimbo de data/hora representa um ponto absoluto no tempo. SQL: confira datetime2. |
char |
char |
|
StringType , String , varchar |
Varchar(n) |
Spark: StringType representa valores de cadeia de caracteres. VarcharType(n) é uma variante de StringType que tem uma limitação de comprimento. A gravação de dados falhará se a cadeia de caracteres de entrada exceder a limitação de comprimento. Esse tipo só pode ser usado no esquema de tabela, não em funções/operadores. CharType(n) é uma variante de VarcharType(n) que tem comprimento fixo. A coluna de leitura do tipo CharType(n) sempre retorna valores de cadeia de caracteres de comprimento n. A comparação de colunas de CharType(n) preencherá a mais curta delas para o comprimento da mais longa. SQL: se houver um comprimento fornecido do Spark, n em varchar(n) será definido com esse comprimento. Se ela for particionada, n poderá ser no máximo 2048. Caso contrário, ele será varchar(max) . Confira char e varchar. Use-o com a ordenação Latin1_General_100_BIN2_UTF8 . |
BinaryType , binary |
varbinary(n) |
SQL: se houver um comprimento fornecido do Spark, n em Varbinary(n) será definido com esse comprimento. Se ela for particionada, n poderá ser no máximo 2048. Caso contrário, ele será Varbinary(max) . Confira binary e varbinary. |
array , map , struct |
varchar(max) |
SQL: serializado em JSON com a ordenação Latin1_General_100_BIN2_UTF8 . Confira Dados JSON. |
Observação
A ordenação no nível do banco de dados é Latin1_General_100_CI_AS_SC_UTF8
.
Modelo de segurança
Os bancos de dados e as tabelas do Spark, bem como as respectivas representações sincronizadas no mecanismo SQL, serão protegidos no nível de armazenamento subjacente. Como eles, atualmente, não têm permissões nos próprios objetos, os objetos podem ser vistos no Pesquisador de Objetos.
A entidade de segurança que cria uma tabela gerenciada é considerada o proprietário dessa tabela e tem todos os direitos na tabela, bem como nas pastas e nos arquivos subjacentes. Além disso, o proprietário do banco de dados se tornará automaticamente o coproprietário da tabela.
Se você criar uma tabela externa SQL ou do Spark com passagem de autenticação, os dados só serão protegidos nos níveis de pasta e de arquivo. Se alguém consultar esse tipo de tabela externa, a identidade de segurança do emissor da consulta será transmitida para o sistema de arquivos, que verificará se há direitos de acesso.
Para obter mais informações sobre como definir permissões nas pastas e nos arquivos, confira Banco de dados compartilhado do Azure Synapse Analytics.
Exemplos
Criar uma tabela gerenciada no Spark e consultá-la no pool de SQL sem servidor
Nesse cenário, você tem um banco de dados do Spark chamado mytestdb
. Confira Criar um banco de dados do Spark e se conectar a ele com o pool de SQL sem servidor.
Crie uma tabela gerenciada do Spark com o SparkSQL executando o seguinte comando:
CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet
Esse comando cria a tabela myparquettable
no banco de dados mytestdb
. Os nomes das tabelas serão convertidos em letras minúsculas. Após um pequeno atraso, você poderá ver a tabela no pool de SQL sem servidor. Por exemplo, execute a instrução a seguir no pool de SQL sem servidor.
USE mytestdb;
SELECT * FROM sys.tables;
Verifique se myparquettable
está incluída nos resultados.
Observação
Uma tabela que não esteja usando Delta, Parquet ou CSV como o formato de armazenamento não será sincronizada.
Em seguida, insira alguns valores na tabela do Spark, por exemplo, com as seguintes instruções C# Spark em um notebook 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");
Agora você pode ler os dados no pool de SQL sem servidor da seguinte maneira:
SELECT * FROM mytestdb.myparquettable WHERE name = 'Alice';
Você deverá obter a seguinte linha como resultado:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01
Criar uma tabela externa no Spark e consultá-la no pool de SQL sem servidor
Neste exemplo, criaremos uma tabela externa do Spark com base nos arquivos de dados do Parquet que foram criados no exemplo anterior para a tabela gerenciada.
Por exemplo, com o SparkSQL, execute:
CREATE TABLE mytestdb.myexternalparquettable
USING Parquet
LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"
Substitua o espaço reservado <storage-name>
pelo nome da conta de armazenamento do ADLS Gen2 que você está usando, o <fs>
pelo nome do sistema de arquivos que você está usando e <synapse_ws>
pelo nome do workspace do Azure Synapse que você está usando para executar este exemplo.
O exemplo anterior cria a tabela myextneralparquettable
no banco de dados mytestdb
. Após um pequeno atraso, você poderá ver a tabela no pool de SQL sem servidor. Por exemplo, execute a instrução a seguir no pool de SQL sem servidor.
USE mytestdb;
SELECT * FROM sys.tables;
Verifique se myexternalparquettable
está incluída nos resultados.
Agora você pode ler os dados no pool de SQL sem servidor da seguinte maneira:
SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';
Você deverá obter a seguinte linha como resultado:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01