Partilhar via


Criar e alterar tabelas externas do Armazenamento do Microsoft Azure

Aplica-se a: ✅Microsoft FabricAzure Data Explorer

Os comandos neste artigo podem ser usados para criar ou alterar uma tabela externa do Armazenamento do Azure no banco de dados do qual o comando é executado. Uma tabela externa do Armazenamento do Azure faz referência a dados localizados no Armazenamento de Blobs do Azure, no Azure Data Lake Store Gen1 ou no Azure Data Lake Store Gen2.

Observação

Se a tabela existir, o .create comando falhará com um erro. Use .create-or-alter ou .alter para modificar tabelas existentes.

Permissões

Requer .create pelo menos permissões de usuário de banco de dados e requer .alter pelo menos permissões de administrador de tabela.

Para .create-or-alter uma tabela externa usando a autenticação de identidade gerenciada, são necessárias permissões AllDatabasesAdmin .

Sintaxe

(.create.alter | | .create-or-alter) external table TableName( Schema) kind = storage [partition(by Partições) [pathformat = (PathFormat)]] = dataformat DataFormat (StorageConnectionString [, ...] ) with([ Propriedade [, ...])]

Observação

kind é storage para todos os tipos de armazenamento de dados externos do Armazenamento do Azure. blob e adl são termos obsoletos.

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Digitar Obrigatória Descrição
TableName string ✔️ Um nome de tabela externa que adere às regras de nomes de entidade. Uma tabela externa não pode ter o mesmo nome que uma tabela regular no mesmo banco de dados.
Esquema string ✔️ O esquema de dados externos é uma lista separada por vírgulas de um ou mais nomes de coluna e tipos de dados, em que cada item segue o formato: ColumnName : ColumnType. Se o esquema for desconhecido, use infer_storage_schema para inferir o esquema com base no conteúdo do arquivo externo.
Partições string Uma lista separada por vírgulas de colunas pela qual a tabela externa é particionada. A coluna Partition pode existir no próprio arquivo de dados ou como parte do caminho do arquivo. Consulte formatação de partições para saber como esse valor deve ficar.
Formato de caminho string Um formato de caminho de URI de pasta de dados externa a ser usado com partições. Consulte o formato do caminho.
DataFormat string ✔️ O formato de dados, que pode ser qualquer um dos formatos de ingestão. Recomendamos usar o formato para tabelas externas para melhorar o desempenho de consulta e exportação, a menos que você use JSON o Parquet mapeamento de caminhos. Ao usar uma tabela externa para o cenário de exportação, você está limitado aos seguintes formatos: CSV, TSV, JSON e Parquet.
StorageConnectionString string ✔️ Um ou mais caminhos separados por vírgulas para contêineres de blobs do Armazenamento de Blobs do Azure, sistemas de arquivos do Azure Data Lake Gen 2 ou contêineres do Azure Data Lake Gen 1, incluindo credenciais. O tipo de armazenamento de tabela externa é determinado pelas cadeias de conexão fornecidas. Consulte cadeias de conexão de armazenamento.
Propriedade string Um par de propriedades chave-valor no formato PropertyName = PropertyValue. Consulte propriedades opcionais.

Observação

Arquivos CSV com esquema não idêntico podem fazer com que os dados pareçam deslocados ou ausentes. Recomendamos separar arquivos CSV com esquemas distintos para separar contêineres de armazenamento e definir uma tabela externa para cada contêiner de armazenamento com o esquema adequado.

Dica

Forneça mais de uma única conta de armazenamento para evitar a limitação de armazenamento ao exportar grandes quantidades de dados para a tabela externa. A exportação distribuirá as gravações entre todas as contas fornecidas.

Autenticação e autorização

O método de autenticação para acessar uma tabela externa é baseado na cadeia de conexão fornecida durante sua criação, e as permissões necessárias para acessar a tabela variam dependendo do método de autenticação.

A tabela a seguir lista os métodos de autenticação com suporte para tabelas externas do Armazenamento do Azure e as permissões necessárias para ler ou gravar na tabela.

Método de autenticação Armazenamento de Blobs do Azure/Data Lake Storage Gen2 Data Lake Storage Gen1
Representação Permissões de leitura: Leitor de Dados do Blob de Armazenamento
Permissões de gravação: Colaborador de Dados do Blob de Armazenamento
Permissões de leitura: Leitor
Permissões de gravação: Colaborador
Identidade gerenciada Permissões de leitura: Leitor de Dados do Blob de Armazenamento
Permissões de gravação: Colaborador de Dados do Blob de Armazenamento
Permissões de leitura: Leitor
Permissões de gravação: Colaborador
Token de Acesso Compartilhado (SAS) Permissões de leitura: Lista + Leitura
Permissões de gravação: Gravar
Não há suporte para esse método de autenticação no Gen1.
Token de acesso do Microsoft Entra Não são necessárias permissões adicionais. Não são necessárias permissões adicionais.
Chave de acesso da conta de armazenamento Não são necessárias permissões adicionais. Não há suporte para esse método de autenticação no Gen1.

Formatação de partições

A lista de partições é qualquer combinação de colunas de partição, especificada usando um dos formulários mostrados na tabela a seguir.

Tipo de partição Sintaxe Observações
Coluna virtual PartitionName : (datetime | string) Leia mais em Colunas virtuais.
Valor da coluna String PartitionName = : string ColumnName
Valor da coluna de string hash() PartitionName =long hash(: ColumnName Número, ) O hash é o número do módulo.
Coluna de data e hora truncada (valor) PartitionName datetime = : (startofmonthstartofweek | | startofyearstartofday | ) ( ColumnName ) Consulte a documentação sobre as funções startofyear, startofmonth, startofweek ou startofday .
Valor = ( bin da coluna de data e hora truncado ColumnName , TimeSpan ) Leia mais sobre a função bin .

Formato do caminho

O parâmetro PathFormat permite que você especifique o formato para o caminho do URI da pasta de dados externos, além das partições. Consiste em uma sequência de elementos de partição e separadores de texto. Um elemento de partição refere-se a uma partição declarada na cláusula de partição by e o separador de texto é qualquer texto entre aspas. Elementos de partição consecutivos devem ser separados usando o separador de texto.

[ StringSeparator ] Partição [ StringSeparator ] [Partição [ StringSeparator ] ...]

Para construir o prefixo do caminho do arquivo original, os elementos de partição são renderizados como strings e separados com separadores de texto correspondentes. Você pode usar a datetime_pattern macro (datetime_pattern(DateTimeFormat, PartitionName)) para especificar o formato usado para renderizar um valor de partição datetime. A macro segue a especificação de formato .NET e permite que os especificadores de formato sejam colocados entre chaves. Por exemplo, os dois formatos a seguir são equivalentes:

  • 'ano='aaaa'/mês='MM
  • ano={aaaa}/mês={MM}

Por padrão, os valores de data e hora são renderizados usando os seguintes formatos:

Função de partição Formato padrão
startofyear yyyy
startofmonth yyyy/MM
startofweek yyyy/MM/dd
startofday yyyy/MM/dd
bin(Coluna, 1d) yyyy/MM/dd
bin(Coluna, 1h) yyyy/MM/dd/HH
bin(Coluna, 1m) yyyy/MM/dd/HH/mm

Dica

Para verificar a exatidão da definição de Partitions e PathFormat , use a propriedade sampleUris ou filesPreview ao criar uma tabela externa.

Colunas virtuais

Quando os dados são exportados do Spark, as colunas de partição (que são fornecidas ao método do gravador de dataframe) partitionBy não são gravadas em arquivos de dados. Esse processo evita a duplicação de dados porque os dados já estão presentes nos nomes de pasta (por exemplo, column1=<value>/column2=<value>/), e o Spark pode reconhecê-los na leitura.

As tabelas externas suportam a leitura desses dados na forma de virtual colums. As colunas virtuais podem ser do tipo string ou datetime, e são especificadas usando a seguinte sintaxe:

.create external table ExternalTable (EventName:string, Revenue:double)  
kind=storage  
partition by (CustomerName:string, Date:datetime)  
pathformat=("customer=" CustomerName "/date=" datetime_pattern("yyyyMMdd", Date))  
dataformat=parquet
( 
   h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)

Para filtrar por colunas virtuais em uma consulta, especifique nomes de partição no predicado de consulta:

external_table("ExternalTable")
 | where Date between (datetime(2020-01-01) .. datetime(2020-02-01))
 | where CustomerName in ("John.Doe", "Ivan.Ivanov")

Propriedades opcionais

Propriedade Type Descrição
folder string Pasta da tabela
docString string Cadeia de caracteres documentando a tabela
compressed bool Se definido, indica se os arquivos são compactados como .gz arquivos (usados somente no cenário de exportação)
includeHeaders string Para formatos de texto delimitados (CSV, TSV, ...), indica se os arquivos contêm um cabeçalho. Os valores possíveis são: All (todos os arquivos contêm um cabeçalho), FirstFile (o primeiro arquivo em uma pasta contém um cabeçalho), None (nenhum arquivo contém um cabeçalho).
namePrefix string Se definido, indica o prefixo dos arquivos. Nas operações de gravação, todos os arquivos serão gravados com esse prefixo. Em operações de leitura, somente arquivos com esse prefixo são lidos.
fileExtension string Se definido, indica as extensões dos arquivos. Na gravação, os nomes dos arquivos terminarão com esse sufixo. Na leitura, somente os arquivos com esta extensão de arquivo serão lidos.
encoding string Indica como o texto é codificado: UTF8NoBOM (padrão) ou UTF8BOM.
sampleUris bool Se definido, o resultado do comando fornecerá vários exemplos de URI de arquivos de dados externos simulados, conforme esperado pela definição de tabela externa. Essa opção ajuda a validar se os parâmetros Partitions e PathFormat estão definidos corretamente.
filesPreview bool Se definido, uma das tabelas de resultados do comando contém uma visualização do comando .show external table artifacts . Como sampleUri, a opção ajuda a validar os parâmetros Partitions e PathFormat da definição de tabela externa.
validateNotEmpty bool Se definidas, as cadeias de conexão são validadas para ter conteúdo nelas. O comando falhará se o local do URI especificado não existir ou se não houver permissões suficientes para acessá-lo.
dryRun bool Se definido, a definição de tabela externa não será mantida. Essa opção é útil para validar a definição da tabela externa, especialmente em conjunto com o filesPreview parâmetro or sampleUris .

Observação

A tabela externa não é acessada durante a criação, apenas durante a consulta e a exportação. Use a propriedade opcional durante a validateNotEmpty criação para garantir que a definição da tabela seja válida e que o armazenamento esteja acessível.

Dica

Para saber mais sobre a função namePrefix e fileExtension as propriedades desempenhadas na filtragem de arquivos de dados durante a consulta, consulte a seção lógica de filtragem de arquivos.

Lógica de filtragem de arquivos

Ao consultar uma tabela externa, o desempenho é aprimorado filtrando arquivos de armazenamento externo irrelevantes. O processo de iteração de arquivos e decisão se um arquivo deve ser processado é o seguinte:

  1. Crie um padrão de URI que represente um local onde os arquivos são encontrados. Inicialmente, o padrão de URI é igual a uma cadeia de conexão fornecida como parte da definição da tabela externa. Se houver partições definidas, elas serão renderizadas usando PathFormat e, em seguida, acrescentadas ao padrão de URI.

  2. Para todos os arquivos encontrados no(s) padrão(ões) de URI criado(s), verifique se:

    • Os valores de partição correspondem aos predicados usados em uma consulta.
    • O nome do blob começa com NamePrefix, se essa propriedade for definida.
    • O nome do blob termina com FileExtension, se essa propriedade for definida.

Depois que todas as condições forem atendidas, o arquivo será buscado e processado.

Observação

O padrão de URI inicial é criado usando valores de predicado de consulta. Isso funciona melhor para um conjunto limitado de valores de cadeia de caracteres, bem como para intervalos de tempo fechados.

Exemplos

Tabela externa não particionada

Na tabela externa não particionada a seguir, espera-se que os arquivos sejam colocados diretamente sob os contêineres definidos:

.create external table ExternalTable (x:long, s:string)  
kind=storage 
dataformat=csv 
( 
   h@'https://storageaccount.blob.core.windows.net/container1;secretKey' 
) 

Particionado por data

Na tabela externa a seguir particionada por data, espera-se que os arquivos sejam colocados em diretórios do formato yyyy/MM/ddde data e hora padrão:

.create external table ExternalTable (Timestamp:datetime, x:long, s:string) 
kind=storage
partition by (Date:datetime = bin(Timestamp, 1d)) 
dataformat=csv 
( 
   h@'abfss://filesystem@storageaccount.dfs.core.windows.net/path;secretKey'
)

Particionado por mês

Na tabela externa a seguir particionada por mês, o formato do diretório é year=yyyy/month=MM:

.create external table ExternalTable (Timestamp:datetime, x:long, s:string) 
kind=storage 
partition by (Month:datetime = startofmonth(Timestamp)) 
pathformat=(datetime_pattern("'year='yyyy'/month='MM", Month)) 
dataformat=csv 
( 
   h@'https://storageaccount.blob.core.windows.net/container1;secretKey' 
) 

Particionado por nome e data

Na tabela externa a seguir, os dados são particionados primeiro pelo nome do cliente e depois pela data, o que significa que a estrutura de diretório esperada é, por exemplo, customer_name=Softworks/2019/02/01:

.create external table ExternalTable (Timestamp:datetime, CustomerName:string) 
kind=storage 
partition by (CustomerNamePart:string = CustomerName, Date:datetime = startofday(Timestamp)) 
pathformat=("customer_name=" CustomerNamePart "/" Date)
dataformat=csv 
(  
   h@'https://storageaccount.blob.core.windows.net/container1;secretKey' 
)

Particionado por hash e data

A tabela externa a seguir é particionada primeiro pelo hash do nome do cliente (módulo dez) e, em seguida, por data. A estrutura de diretório esperada é, por exemplo, customer_id=5/dt=20190201, , e os nomes dos arquivos de dados terminam com a .txt extensão:

.create external table ExternalTable (Timestamp:datetime, CustomerName:string) 
kind=storage 
partition by (CustomerId:long = hash(CustomerName, 10), Date:datetime = startofday(Timestamp)) 
pathformat=("customer_id=" CustomerId "/dt=" datetime_pattern("yyyyMMdd", Date)) 
dataformat=csv 
( 
   h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
with (fileExtension = ".txt")

Filtrar por colunas de partição em uma consulta

Para filtrar por colunas de partição em uma consulta, especifique o nome da coluna original no predicado de consulta:

external_table("ExternalTable")
 | where Timestamp between (datetime(2020-01-01) .. datetime(2020-02-01))
 | where CustomerName in ("John.Doe", "Ivan.Ivanov")

Saída de exemplo

TableName TableType Pasta DocString Propriedades ConnectionStrings Partições Formato de caminho
Mesa Externa Blob ExternalTables Docs {"Format":"Csv","Compactado":false,"CompressionType":null,"FileExtension":null,"IncludeHeaders":"Nenhum","Encoding":null,"NamePrefix":null} ["https://storageaccount.blob.core.windows.net/container1;*******"] [{"Mod":10,"Nome":"CustomerId","ColumnName":"CustomerName","Ordinal":0},{"Function":"StartOfDay","Name":"Data","ColumnName":"Timestamp","Ordinal":1}] "customer_id=" CustomerId "/dt=" datetime_pattern("aaaaMMdd",Data)