Tabelas de metadados compartilhadas do Azure Synapse Analytics
O Azure Synapse Analytics permite que os diferentes mecanismos computacionais do espaço de trabalho compartilhem bancos de dados e tabelas entre seus pools do Apache Spark e o pool SQL sem servidor.
Depois que um banco de dados tiver sido criado por um trabalho do Spark, você poderá criar tabelas nele com o Spark que usam Parquet, Delta ou CSV como formato de armazenamento. Os nomes das tabelas serão convertidos em minúsculas e precisam ser consultados usando o nome minúsculo. Essas tabelas ficarão imediatamente disponíveis para consulta por qualquer um dos pools Spark do espaço de trabalho do Azure Synapse. Eles também podem ser usados a partir de 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 SQL sem servidor. A exposição de uma tabela do Spark no SQL fornece mais detalhes sobre a sincronização da tabela.
Como as tabelas são sincronizadas com o pool SQL sem servidor de forma assíncrona, haverá um pequeno atraso até que elas apareçam.
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 de pool do Apache Spark sem servidor e crie tabelas nele a partir do Spark.
Os objetos em bancos de dados sincronizados não podem ser modificados a partir do pool SQL sem servidor.
Expor uma tabela do Spark em SQL
Mesas 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. Esses arquivos são normalmente armazenados no diretório onde os dados da
warehouse
tabela gerenciada são armazenados.Tabelas externas
O Spark também fornece maneiras de criar tabelas externas sobre dados existentes, fornecendo a
LOCATION
opção ou usando o formato Hive. Essas tabelas externas podem estar em uma variedade de formatos de dados, incluindo Parquet.
Atualmente, o Azure Synapse compartilha apenas tabelas Spark gerenciadas e externas que armazenam seus dados no formato Parquet, Delta ou CSV com os mecanismos SQL. As tabelas suportadas por outros formatos não são sincronizadas automaticamente. Você mesmo pode sincronizar essas tabelas explicitamente como uma tabela externa em seu próprio banco de dados SQL se o mecanismo SQL oferecer suporte ao formato subjacente da tabela.
Nota
Atualmente, apenas os formatos Parquet e CSV são totalmente suportados no pool SQL sem servidor. As tabelas Delta do Spark também estão disponíveis no pool SQL sem servidor, mas esse recurso está em visualização pública. As tabelas externas criadas no Spark não estão disponíveis em bancos de dados de pool SQL dedicados.
Partilhar mesas do Spark
As tabelas Spark gerenciadas e externas compartilháveis expostas no mecanismo SQL como tabelas externas com as seguintes propriedades:
- A fonte de dados da tabela externa SQL é a fonte de dados que representa a pasta de localização da tabela do Spark.
- O formato de arquivo da tabela externa SQL é Parquet, Delta ou CSV.
- A credencial de acesso da tabela externa SQL é de passagem.
Como todos os nomes de tabela do Spark são nomes de tabela SQL válidos e todos os nomes de coluna do Spark são nomes de coluna SQL válidos, os nomes de tabela e coluna do Spark serão usados para a tabela externa SQL.
As tabelas Spark fornecem tipos de dados diferentes dos mecanismos Synapse SQL. A tabela a seguir mapeia os tipos de dados de tabela do Spark mapeados para os tipos SQL:
Tipo de dados do Spark | Tipo de dados SQL | Comentários |
---|---|---|
LongType , long , bigint |
bigint |
Faísca: LongType representa números inteiros assinados de 8 bytes. SQL: Consulte int, bigint, smallint e tinyint. |
BooleanType , boolean |
bit (Parquet), varchar(6) (CSV) |
Faísca: Booleano. SQL: Consulte [/sql/t-sql/data-types/bit-transact-sql]. |
DecimalType , decimal , dec , numeric |
decimal |
Faísca: DecimalType representa números decimais assinados com precisão arbitrária. Apoiado internamente por java.math.BigDecimal. Um BigDecimal consiste em um inteiro de precisão arbitrário, valor não dimensionado e uma escala inteira de 32 bits. SQL: Precisão fixa e números de escala. Quando a precisão máxima é usada, os valores válidos são de - 10^38 +1 a 10^38 - 1. Os sinónimos ISO para decimal são dec e dec(p, s). numérico é funcionalmente idêntico ao decimal. Veja decimal e numérico. |
IntegerType , Integer , int |
int |
Spark IntegerType representa números inteiros assinados de 4 bytes. SQL: Consulte int, bigint, smallint e tinyint. |
ByteType , Byte , tinyint |
smallint |
Faísca: ByteType representa números inteiros assinados de 1 byte [-128 a 127] e ShortType representa números inteiros assinados de 2 bytes [-32768 a 32767]. SQL: Tinyint representa números inteiros assinados de 1 byte [0, 255] e smallint representa números inteiros assinados de 2 bytes [-32768, 32767]. Veja int, bigint, smallint e tinyint. |
ShortType , Short , smallint |
smallint |
Mesmo que acima. |
DoubleType , Double |
float |
Faísca: DoubleType representa números de ponto flutuante de precisão dupla de 8 bytes. SQL: Veja float e real. |
FloatType , float , real |
real |
Faísca: FloatType representa números de ponto flutuante de precisão dupla de 4 bytes. SQL: Veja float e real. |
DateType , date |
date |
Faísca: DateType representa valores que compreendem valores de campos ano, mês e dia, sem um fuso horário. SQL: Ver data. |
TimestampType , timestamp |
datetime2 |
Spark: TimestampType representa valores que compreendem 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: Consulte 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. Este tipo só pode ser usado no esquema de tabela, não em funções/operadores. CharType(n) é uma variante de VarcharType(n) que é de comprimento fixo. A coluna de leitura do tipo CharType(n) sempre retorna valores de cadeia de caracteres de comprimento n. A comparação da coluna CharType(n) irá inserir a curta no comprimento mais longo. SQL: Se houver um comprimento fornecido pelo Spark, n em varchar(n) será definido para esse comprimento. Se for coluna particionada, n pode ser no máximo 2048. Caso contrário, será varchar(max). Veja char e varchar. Use-o com agrupamento Latin1_General_100_BIN2_UTF8 . |
BinaryType , binary |
varbinary(n) |
SQL: Se houver um comprimento fornecido pelo Spark, n em Varbinary(n) será definido para esse comprimento. Se for coluna particionada, n pode ser no máximo 2048. Caso contrário, será Varbinary(max). Veja binário e varbinário. |
array , map , struct |
varchar(max) |
SQL: Serializa em JSON com agrupamento Latin1_General_100_BIN2_UTF8 . Consulte Dados JSON. |
Nota
O agrupamento no nível do banco de dados é Latin1_General_100_CI_AS_SC_UTF8
.
Modelo de segurança
Os bancos de dados e tabelas do Spark e suas representações sincronizadas no mecanismo SQL serão protegidos no nível de armazenamento subjacente. Como eles não têm permissões nos próprios objetos, os objetos podem ser vistos no explorador de objetos.
O principal de segurança que cria uma tabela gerida é considerado o proprietário dessa tabela e tem todos os direitos sobre a mesma, bem como sobre as pastas e ficheiros subjacentes. Além disso, o proprietário da base de dados passará automaticamente a ser coproprietário da tabela.
Se criar uma tabela externa do Spark ou SQL com pass-through de autenticação, os dados só são protegidos aos níveis da pasta e do ficheiro. Se alguém consultar este tipo de tabela externa, a identidade de segurança do submissor da consulta é passada para o sistema de ficheiros, que verificará os direitos de acesso.
Para obter mais informações sobre como definir permissões nas pastas e arquivos, consulte Banco de dados compartilhado do Azure Synapse Analytics.
Exemplos
Criar uma tabela gerenciada no Spark e consultar a partir do pool SQL sem servidor
Nesse cenário, você tem um banco de dados Spark chamado mytestdb
. Consulte Criar e conectar-se a um banco de dados do Spark com pool SQL sem servidor.
Crie uma tabela Spark gerenciada com o SparkSQL executando o seguinte comando:
CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet
Este comando cria a tabela myparquettable
no banco de dados mytestdb
. Os nomes das tabelas serão convertidos em minúsculas. Após um pequeno atraso, você pode ver a tabela em seu pool SQL sem servidor. Por exemplo, execute a seguinte instrução do seu pool SQL sem servidor.
USE mytestdb;
SELECT * FROM sys.tables;
Verifique se myparquettable
está incluído nos resultados.
Nota
Uma tabela que não esteja usando Delta, Parquet ou CSV como seu formato de armazenamento não será sincronizada.
Em seguida, insira alguns valores do Spark na tabela, por exemplo, com as seguintes instruções C# Spark em um bloco de anotações 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 do seu pool SQL sem servidor da seguinte maneira:
SELECT * FROM mytestdb.myparquettable WHERE name = 'Alice';
Você deve obter a seguinte linha como resultado:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01
Criar uma tabela externa no Spark e consultar a partir do pool SQL sem servidor
Neste exemplo, criaremos uma tabela Spark externa sobre os arquivos de dados do Parquet 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 ADLS Gen2 que você está usando, <fs>
pelo nome do sistema de arquivos que está usando e pelo espaço reservado <synapse_ws>
pelo nome do espaço de trabalho Sinapse do Azure 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ê pode ver a tabela em seu pool SQL sem servidor. Por exemplo, execute a seguinte instrução do seu pool SQL sem servidor.
USE mytestdb;
SELECT * FROM sys.tables;
Verifique se myexternalparquettable
está incluído nos resultados.
Agora você pode ler os dados do seu pool SQL sem servidor da seguinte maneira:
SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';
Você deve obter a seguinte linha como resultado:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01