tabelas de metadados partilhados do Azure Synapse Analytics

Azure Synapse Analytics permite que os diferentes motores computacionais da área de trabalho partilhem bases de dados e tabelas entre os respetivos conjuntos do Apache Spark e o conjunto de SQL sem servidor.

Assim que uma base de dados tiver sido criada por uma tarefa do Spark, pode criar tabelas na mesma com o Spark que utilizam Parquet, Delta ou CSV como formato de armazenamento. Os nomes das tabelas serão convertidos em minúsculas e terão de ser consultados com o nome em minúsculas. Estas tabelas ficarão imediatamente disponíveis para consulta por qualquer um dos conjuntos do Spark da área de trabalho Azure Synapse. Também podem ser utilizadas a partir de qualquer uma das tarefas do Spark sujeitas a permissões.

As tabelas criadas, geridas e externas do Spark também são disponibilizadas como tabelas externas com o mesmo nome na base de dados sincronizada correspondente no conjunto de SQL sem servidor. Expor uma tabela do Spark no SQL fornece mais detalhes sobre a sincronização de tabelas.

Uma vez que as tabelas são sincronizadas com o conjunto de SQL sem servidor de forma assíncrona, haverá um pequeno atraso até que apareçam.

Gerir uma tabela criada pelo Spark

Utilize o Spark para gerir bases de dados criadas pelo Spark. Por exemplo, elimine-o através de um trabalho de conjunto do Apache Spark sem servidor e crie tabelas no mesmo a partir do Spark.

Os objetos em bases de dados sincronizadas não podem ser modificados a partir do conjunto de SQL sem servidor.

Expor uma tabela do Spark no SQL

Tabelas do Spark partilhadas

O Spark fornece dois tipos de tabelas que Azure Synapse expõe automaticamente no SQL:

  • Tabelas geridas

    O Spark fornece várias opções para armazenar dados em tabelas geridas, como TEXTO, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA e LIBSVM. Normalmente, estes ficheiros são armazenados no diretório onde os warehouse dados da tabela gerida são armazenados.

  • Tabelas externas

    O Spark também fornece formas de criar tabelas externas através de dados existentes ao fornecer a opção LOCATION ou ao utilizar o formato do Hive. Estas tabelas externas podem ser sobre uma variedade de formatos de dados, incluindo Parquet.

Azure Synapse atualmente, apenas partilha tabelas do Spark geridas e externas que armazenam os respetivos dados no formato Parquet, DELTA ou CSV com os motores SQL. As tabelas suportadas por outros formatos não são sincronizadas automaticamente. Poderá sincronizar essas tabelas explicitamente como uma tabela externa na sua própria base de dados SQL se o motor SQL suportar o formato subjacente da tabela.

Nota

Atualmente, apenas os formatos Parquet e CSV são totalmente suportados no conjunto de SQL sem servidor. As tabelas Delta do Apache Spark também estão disponíveis no conjunto de SQL sem servidor, mas esta funcionalidade está em pré-visualização pública. As tabelas externas criadas no Spark não estão disponíveis em bases de dados de conjuntos de SQL dedicadas.

Partilhar tabelas do Spark

As tabelas do Spark geridas e externas partilháveis expostas no motor SQL como tabelas externas com as seguintes propriedades:

  • A origem de dados da tabela externa SQL é a origem de dados que representa a pasta de localização da tabela Spark.
  • O formato de ficheiro da tabela externa SQL é Parquet, Delta ou CSV.
  • A credencial de acesso da tabela externa SQL é pass-through.

Uma vez que todos os nomes de tabelas do Spark são nomes de tabelas SQL válidos e todos os nomes de colunas do Spark são nomes de colunas SQL válidos, os nomes de tabelas e colunas do Spark serão utilizados para a tabela externa do SQL.

As tabelas do Spark fornecem tipos de dados diferentes dos motores SQL do Synapse. A tabela seguinte mapeia os tipos de dados da tabela Spark mapeados para os tipos de SQL:

Tipo de dados do Spark Tipo de dados SQL Comentários
LongType, long, bigint bigint Spark: LongType representa números inteiros assinados com 8 bytes.
SQL: Ver int, bigint, smallint e tinyint.
BooleanType, boolean bit (Parquet), varchar(6) (CSV) Spark: Booleano.
SQL: consulte [/sql/t-sql/data-types/bit-transact-sql).
DecimalType, decimal, dec, numeric decimal Spark: DecimalType representa números decimais projetados de precisão arbitrária. Apoiado internamente por java.math.BigDecimal. Um BigDecimal consiste num valor inteiro de precisão arbitrária sem escala e numa escala de números inteiros de 32 bits.
SQL: números de precisão e escala fixos. Quando é utilizada a precisão máxima, 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 O SparkIntegerType representa números inteiros assinados com 4 bytes.
SQL: Ver int, bigint, smallint e tinyint.
ByteType, Byte, tinyint smallint Spark: 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 com 1 byte [0, 255] e smallint representa números inteiros assinados com 2 bytes [-32768, 32767]. Ver int, bigint, smallint, e tinyint.
ShortType, Short, smallint smallint Mesmo que acima.
DoubleType, Double float Spark: DoubleType representa números de vírgula flutuante de precisão dupla de 8 bytes. SQL: veja flutuante e real.
FloatType, float, real real Spark: FloatType representa números de vírgula flutuante de precisão dupla de 4 bytes. SQL: veja flutuante e real.
DateType, date date Spark: DateType representa valores que incluem valores de campos ano, mês e dia, sem fuso horário.
SQL: ver data.
TimestampType, timestamp datetime2 Spark: TimestampType representa valores que incluem 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: veja datetime2.
char char
StringType, String, varchar Varchar(n) Spark: StringType representa valores de cadeia de carateres. VarcharType(n) é uma variante de StringType que tem uma limitação de comprimento. A escrita de dados falhará se a cadeia de entrada exceder a limitação de comprimento. Este tipo só pode ser utilizado no esquema da tabela e não em funções/operadores.
CharType(n) é uma variante de VarcharType(n) que tem um comprimento fixo. A coluna de leitura do tipo CharType(n) devolve sempre valores de cadeia de carateres de comprimento n. A comparação de colunas CharType(n) irá preencher a curta para o comprimento mais longo.
SQL: se existir um comprimento fornecido pelo Spark, n em varchar(n) será definido para esse comprimento. Se for uma coluna particionada, n pode ser máx. 2048. Caso contrário, será varchar(max). Veja caráter e varchar.
Utilize-o com o agrupamento Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL: se existir um comprimento fornecido pelo Spark, n em Varbinary(n) será definido para esse comprimento. Se for uma coluna particionada, n pode ser máx. 2048. Caso contrário, será Varbinary(max). Veja binário e varbinário.
array, map, struct varchar(max) SQL: serializa em JSON com o agrupamento Latin1_General_100_BIN2_UTF8. Veja Dados JSON.

Nota

O agrupamento ao nível da base de dados é Latin1_General_100_CI_AS_SC_UTF8.

Modelo de segurança

As bases de dados e tabelas do Spark, bem como as respetivas representações sincronizadas no motor SQL, serão protegidas ao nível do armazenamento subjacente. Uma vez que atualmente 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 ficheiros, veja base de dados partilhada do Azure Synapse Analytics.

Exemplos

Criar uma tabela gerida no Spark e consultar a partir do conjunto de SQL sem servidor

Neste cenário, tem uma base de dados do Spark chamada mytestdb. Veja Criar e ligar a uma base de dados do Spark com um conjunto de SQL sem servidor.

Crie uma tabela do Spark gerida com o SparkSQL ao executar o seguinte comando:

    CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet

Este comando cria a tabela myparquettable na base de dados mytestdb. Os nomes das tabelas serão convertidos em minúsculas. Após um breve atraso, pode ver a tabela no conjunto de SQL sem servidor. Por exemplo, execute a seguinte instrução a partir do conjunto de SQL sem servidor.

    USE mytestdb;
    SELECT * FROM sys.tables;

Verifique se myparquettable está incluído nos resultados.

Nota

Uma tabela que não esteja a utilizar o Delta, Parquet ou CSV, uma vez que o formato de armazenamento não será sincronizado.

Em seguida, insira alguns valores na tabela a partir do Spark, por exemplo, com as seguintes instruções C# Spark num bloco de notas 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, pode ler os dados do conjunto de SQL sem servidor da seguinte forma:

SELECT * FROM mytestdb.dbo.myparquettable WHERE name = 'Alice';

Deverá 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 conjunto de SQL sem servidor

Neste exemplo, vamos criar uma tabela do Spark externa sobre os ficheiros de dados parquet que foram criados no exemplo anterior para a tabela gerida.

Por exemplo, com a execução do SparkSQL:

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 marcador <storage-name> de posição pelo nome da conta de armazenamento do ADLS Gen2 que está a utilizar, <fs> pelo nome do sistema de ficheiros que está a utilizar e pelo marcador <synapse_ws> de posição pelo nome da área de trabalho Azure Synapse que está a utilizar para executar este exemplo.

O exemplo anterior cria a tabela myextneralparquettable na base de dados mytestdb. Após um breve atraso, pode ver a tabela no conjunto de SQL sem servidor. Por exemplo, execute a seguinte instrução a partir do conjunto de SQL sem servidor.

USE mytestdb;
SELECT * FROM sys.tables;

Verifique se myexternalparquettable está incluído nos resultados.

Agora, pode ler os dados do conjunto de SQL sem servidor da seguinte forma:

SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';

Deverá obter a seguinte linha como resultado:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

Passos seguintes