CRIAR TABELA EXTERNA (Transact-SQL)
Cria uma tabela externa.
Este artigo fornece a sintaxe, argumentos, observações, permissões e exemplos para qualquer produto SQL escolhido.
Para obter mais informações sobre as convenções de sintaxe, consulte Transact-SQL convenções de sintaxe.
Selecione um produto
Na linha seguinte, selecione o nome do produto em que está interessado e apenas as informações desse produto são apresentadas.
* SQL Server *
Plataforma de análise
Sistema (PDW)
Visão geral: SQL Server
Este comando cria uma tabela externa para o PolyBase acessar dados armazenados em um cluster Hadoop ou tabela externa PolyBase de Armazenamento de Blob do Azure que faz referência a dados armazenados em um cluster Hadoop ou Armazenamento de Blob do Azure.
Aplica-se a: SQL Server 2016 (ou superior)
Use uma tabela externa com uma fonte de dados externa para consultas PolyBase. As fontes de dados externas são usadas para estabelecer conectividade e dar suporte a estes casos de uso primários:
- Virtualização de dados e carregamento de dados usando PolyBase
- Operações de carregamento em massa usando o SQL Server ou o Banco de dados SQL usando
BULK INSERT
ouOPENROWSET
Consulte também CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.
Sintaxe
-- Create a new external table
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ ,...n ] )
WITH (
LOCATION = 'folder_or_filepath',
DATA_SOURCE = external_data_source_name,
[ FILE_FORMAT = external_file_format_name ]
[ , <reject_options> [ ,...n ] ]
)
[;]
<reject_options> ::=
{
| REJECT_TYPE = value | percentage
| REJECT_VALUE = reject_value
| REJECT_SAMPLE_VALUE = reject_sample_value,
| REJECTED_ROW_LOCATION = '/REJECT_Directory'
}
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
Argumentos
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
O nome de uma a três partes da tabela a ser criada. Para uma tabela externa, o SQL armazena apenas os metadados da tabela, juntamente com estatísticas básicas sobre o arquivo ou pasta referenciado no Hadoop ou no Armazenamento de Blobs do Azure. Nenhum dado real é movido ou armazenado no SQL Server.
Importante
Para obter o melhor desempenho, se o driver da fonte de dados externa oferecer suporte a um nome de três partes, é altamente recomendável fornecer o nome de três partes.
<column_definition> [ ,...n ]
CREATE EXTERNAL TABLE suporta a capacidade de configurar o nome da coluna, o tipo de dados, a anulabilidade e o agrupamento. Não é possível usar a RESTRIÇÃO PADRÃO em tabelas externas.
As definições de coluna, incluindo os tipos de dados e o número de colunas, devem corresponder aos dados nos arquivos externos. Se houver uma incompatibilidade, as linhas do arquivo serão rejeitadas ao consultar os dados reais.
LOCALIZAÇÃO = 'folder_or_filepath'
Especifica a pasta ou o caminho do arquivo e o nome do arquivo para os dados reais no Hadoop ou no Armazenamento de Blobs do Azure. Além disso, o armazenamento de objetos compatível com o S3 é suportado a partir do SQL Server 2022 (16.x)). O local começa a partir da pasta raiz. A pasta raiz é o local de dados especificado na fonte de dados externa.
No SQL Server, a instrução CREATE EXTERNAL TABLE cria o caminho e a pasta, caso ainda não exista. Em seguida, você pode usar INSERT INTO para exportar dados de uma tabela local do SQL Server para a fonte de dados externa. Para obter mais informações, consulte Consultas PolyBase.
Se você especificar LOCATION como uma pasta, uma consulta PolyBase selecionada na tabela externa recuperará arquivos da pasta e de todas as suas subpastas. Assim como o Hadoop, o PolyBase não retorna pastas ocultas. Ele também não retorna arquivos para os quais o nome do arquivo começa com um sublinhado (_) ou um ponto (.).
No exemplo de imagem a seguir, se LOCATION='/webdata/'
, uma consulta PolyBase retornará linhas de mydata.txt
e mydata2.txt
. Ele não retornará mydata3.txt
porque é um arquivo em uma subpasta oculta. E ele não retornará _hidden.txt
porque é um arquivo oculto.
Para alterar o padrão e ler apenas a partir da pasta raiz, defina o atributo <polybase.recursive.traversal>
como 'false' no arquivo de configuração core-site.xml. Esse arquivo está localizado em <SqlBinRoot>\PolyBase\Hadoop\Conf
sob a raiz bin
do SQL Server. Por exemplo, C:\Program Files\Microsoft SQL Server\MSSQL13.XD14\MSSQL\Binn
.
DATA_SOURCE = external_data_source_name
Especifica o nome da fonte de dados externa que contém o local dos dados externos. Esse local é um Hadoop File System (HDFS), um contêiner de Armazenamento de Blob do Azure ou o Azure Data Lake Store. Para criar uma fonte de dados externa, use CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Especifica o nome do objeto de formato de arquivo externo que armazena o tipo de arquivo e o método de compactação para os dados externos. Para criar um formato de arquivo externo, use CREATE EXTERNAL FILE FORMAT.
Formatos de arquivo externos podem ser reutilizados por vários arquivos externos semelhantes.
Opções de rejeição
Esta opção só pode ser usada com fontes de dados externas onde TYPE = HADOOP.
Você pode especificar parâmetros de rejeição que determinam como o PolyBase lidará com registros de sujos que recupera da fonte de dados externa. Um registo de dados é considerado "sujo" se os tipos de dados reais ou o número de colunas não corresponderem às definições de coluna da tabela externa.
Quando você não especifica ou altera valores de rejeição, o PolyBase usa valores padrão. Essas informações sobre os parâmetros de rejeição são armazenadas como metadados adicionais quando você cria uma tabela externa com a instrução CREATE EXTERNAL TABLE. Quando uma futura instrução SELECT ou uma instrução SELECT INTO SELECT seleciona dados da tabela externa, o PolyBase usará as opções de rejeição para determinar o número ou a porcentagem de linhas que podem ser rejeitadas antes que a consulta real falhe. A consulta retornará resultados (parciais) até que o limite de rejeição seja excedido. Em seguida, ele falha com a mensagem de erro apropriada.
REJECT_TYPE = valor | percentagem
Esclarece se a opção REJECT_VALUE é especificada como um valor literal ou uma porcentagem.
valor
REJECT_VALUE é um valor literal, não uma percentagem. A consulta falhará quando o número de linhas rejeitadas exceder reject_value.
Por exemplo, se REJECT_VALUE = 5
e REJECT_TYPE = value
, a consulta SELECT falhará após cinco linhas terem sido rejeitadas.
percentagem
REJECT_VALUE é uma percentagem, não um valor literal. Uma consulta falhará quando o percentual de
REJECT_VALUE = reject_value
Especifica o valor ou a porcentagem de linhas que podem ser rejeitadas antes que a consulta falhe.
Para REJECT_TYPE = valor, reject_value deve ser um número inteiro entre 0 e 2.147.483.647.
Para REJECT_TYPE = percentagem, reject_value deve ser um flutuador entre 0 e 100.
REJECT_SAMPLE_VALUE = reject_sample_value
Esse atributo é necessário quando você especifica REJECT_TYPE = porcentagem. Ele determina o número de linhas a serem recuperadas antes que o PolyBase recalcule a porcentagem de linhas rejeitadas.
O parâmetro reject_sample_value deve ser um número inteiro entre 0 e 2.147.483.647.
Por exemplo, se REJECT_SAMPLE_VALUE = 1000, o PolyBase calculará a porcentagem de linhas com falha depois de tentar importar 1000 linhas do arquivo de dados externo. Se a porcentagem de linhas com falha for menor que reject_value, o PolyBase tentará recuperar outras 1000 linhas. Ele continua a recalcular a porcentagem de linhas com falha depois de tentar importar cada 1000 linhas adicionais.
Observação
Como o PolyBase calcula a porcentagem de linhas com falha em intervalos, a porcentagem real de linhas com falha pode exceder reject_value.
Exemplo:
Este exemplo mostra como as três opções REJECT interagem entre si. Por exemplo, se REJECT_TYPE = porcentagem, REJECT_VALUE = 30 e REJECT_SAMPLE_VALUE = 100, o seguinte cenário pode ocorrer:
- O PolyBase tenta recuperar as primeiras 100 linhas; 25 reprovam e 75 conseguem.
- A porcentagem de linhas com falha é calculada como 25%, que é menor do que o valor de rejeição de 30%. Como resultado, o PolyBase continuará recuperando dados da fonte de dados externa.
- O PolyBase tenta carregar as próximas 100 linhas; Desta vez, 25 linhas são bem-sucedidas e 75 linhas falham.
- A porcentagem de linhas com falha é recalculada como 50%. A porcentagem de linhas com falha excedeu o valor de rejeição de 30%.
- A consulta PolyBase falha com 50% linhas rejeitadas depois de tentar retornar as primeiras 200 linhas. Observe que as linhas correspondentes foram retornadas antes que a consulta PolyBase detete que o limite de rejeição foi excedido.
REJECTED_ROW_LOCATION = de Localização do Diretório
Aplica-se a: SQL Server 2019 CU6 e versões posteriores, Azure Synapse Analytics.
Especifica o diretório dentro da Fonte de Dados Externa que as linhas rejeitadas e o arquivo de erro correspondente devem ser gravados.
Se o caminho especificado não existir, o PolyBase criará um em seu nome. Um diretório filho é criado com o nome "_rejectedrows". O caractere "_" garante que o diretório seja escapado para outro processamento de dados, a menos que explicitamente nomeado no parâmetro location. Dentro deste diretório, há uma pasta criada com base no tempo de envio de carga no formato YearMonthDay -HourMinuteSecond
(Ex. 20230330-173205
). Nesta pasta, dois tipos de arquivos são gravados, o arquivo _reason e o arquivo de dados. Esta opção só pode ser usada com fontes de dados externas onde TYPE = HADOOP e para tabelas externas usando DELIMITEDTEXT FORMAT_TYPE. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.
Os arquivos de motivo e os arquivos de dados têm o queryID associado à instrução CTAS. Como os dados e o motivo estão em arquivos separados, os arquivos correspondentes têm um sufixo correspondente.
Permissões
Requer estas permissões de usuário:
- CRIAR TABELA
- ALTERAR QUALQUER ESQUEMA
- ALTERAR QUALQUER FONTE DE DADOS EXTERNA
- ALTERAR QUALQUER FORMATO DE ARQUIVO EXTERNO (aplica-se apenas a fontes de dados externas do Hadoop e do Armazenamento do Azure)
- CONTROL DATABASE (aplica-se apenas a fontes de dados externas do Hadoop e do Armazenamento do Azure)
Observe que o logon remoto especificado na DATABASE SCOPED CREDENTIAL usada no comando CREATE EXTERNAL TABLE deve ter permissão de leitura para o caminho/tabela/coleção na fonte de dados externa especificada no parâmetro LOCATION. Se você estiver planejando usar essa TABELA EXTERNA para exportar dados para uma fonte de dados externa do Hadoop ou do Armazenamento do Azure, o logon especificado deverá ter permissão de gravação no caminho especificado em LOCATION. Observe que o Hadoop não é suportado atualmente no SQL Server 2022 (16.x).
Para o Armazenamento de Blobs do Azure, ao configurar as chaves de acesso e a assinatura de acesso compartilhado (SAS) no portal do Azure, as contas de armazenamento do Armazenamento de Blob do Azure ou do ADLS Gen2, configure o de permissões
Importante
A permissão ALTER ANY EXTERNAL DATA SOURCE concede a qualquer entidade de segurança a capacidade de criar e modificar qualquer objeto de fonte de dados externa e, portanto, também concede a capacidade de acessar todas as credenciais de escopo do banco de dados no banco de dados. Essa permissão deve ser considerada altamente privilegiada e, portanto, deve ser concedida apenas a entidades confiáveis no sistema.
Tratamento de erros
Ao executar a instrução CREATE EXTERNAL TABLE, O PolyBase tenta se conectar à fonte de dados externa. Se a tentativa de conexão falhar, a instrução falhará e a tabela externa não será criada. Pode levar um minuto ou mais para que o comando falhe, já que o PolyBase tenta novamente a conexão antes de eventualmente falhar na consulta.
Comentários
Em cenários de consulta ad hoc, como SELECT FROM EXTERNAL TABLE, O PolyBase armazena as linhas recuperadas da fonte de dados externa em uma tabela temporária. Após a conclusão da consulta, o PolyBase remove e exclui a tabela temporária. Nenhum dado permanente é armazenado em tabelas SQL.
Por outro lado, no cenário de importação, como SELECT INTO FROM EXTERNAL TABLE, O PolyBase armazena as linhas recuperadas da fonte de dados externa como dados permanentes na tabela SQL. A nova tabela é criada durante a execução da consulta quando o PolyBase recupera os dados externos.
O PolyBase pode enviar parte da computação da consulta para o Hadoop para melhorar o desempenho da consulta. Esta ação é chamada de pushdown de predicado. Para habilitá-lo, especifique a opção de local do gerenciador de recursos do Hadoop em CREATE EXTERNAL DATA SOURCE.
Você pode criar muitas tabelas externas que fazem referência à mesma fonte de dados externa ou a fontes de dados externas diferentes.
Limitações e restrições
Como os dados de uma tabela externa não estão sob o controle de gerenciamento direto do SQL Server, eles podem ser alterados ou removidos a qualquer momento por um processo externo. Como resultado, não é garantido que os resultados da consulta em uma tabela externa sejam determinísticos. A mesma consulta pode retornar resultados diferentes cada vez que é executada em uma tabela externa. Da mesma forma, uma consulta pode falhar se os dados externos forem movidos ou removidos.
Você pode criar várias tabelas externas que fazem referência a diferentes fontes de dados externas. Se você executar consultas simultaneamente em diferentes fontes de dados Hadoop, cada fonte Hadoop deverá usar a mesma definição de configuração do servidor 'conectividade hadoop'. Por exemplo, não é possível executar simultaneamente uma consulta em um cluster Hadoop do Cloudera e em um cluster Hadoop do Hortonworks, pois eles usam definições de configuração diferentes. Para obter as definições de configuração e as combinações suportadas, consulte PolyBase Connectivity Configuration.
Quando a tabela externa está usando DELIMITEDTEXT
, CSV
, PARQUET
ou DELTA
como tipos de dados, as tabelas externas oferecem suporte apenas a estatísticas para uma coluna por CREATE STATISTICS
comando.
Somente estas instruções DDL (Data Definition Language) são permitidas em tabelas externas:
- CRIAR TABELA E SOLTAR TABELA
- CRIAR ESTATÍSTICAS e DROP STATISTICS
- CRIAR VISTA E DROP VIEW
Construções e operações não suportadas:
- A restrição DEFAULT em colunas de tabela externas
- Operações DML (Data Manipulation Language) de exclusão, inserção e atualização
Limitações de consulta
O PolyBase pode consumir um máximo de 33 mil arquivos por pasta ao executar 32 consultas PolyBase simultâneas. Este número máximo inclui ficheiros e subpastas em cada pasta HDFS. Se o grau de simultaneidade for inferior a 32, um usuário pode executar consultas PolyBase em pastas no HDFS que contenham mais de 33k arquivos. Recomendamos que você mantenha os caminhos de arquivos externos curtos e não use mais de 30 mil arquivos por pasta HDFS. Quando muitos arquivos são referenciados, uma exceção de falta de memória da Java Virtual Machine (JVM) pode ocorrer.
Limitações de largura da tabela
O PolyBase no SQL Server 2016 tem um limite de largura de linha de 32 KB com base no tamanho máximo de uma única linha válida por definição de tabela. Se a soma do esquema de coluna for maior que 32 KB, o PolyBase não poderá consultar os dados.
Limitações do tipo de dados
Os seguintes tipos de dados não podem ser usados em tabelas externas do PolyBase:
geography
geometry
hierarchyid
image
text
nText
xml
- Qualquer tipo definido pelo usuário
Limitações específicas da fonte de dados
Oráculo
Os sinônimos Oracle não são suportados para uso com o PolyBase.
Tabelas externas para coleções MongoDB que contêm matrizes
Para criar tabelas externas para coleções MongoDB que contenham matrizes, você deve usar a extensão Data Virtualization para o Azure Data Studio para produzir uma instrução CREATE EXTERNAL TABLE com base no esquema detetado pelo driver ODBC PolyBase para MongoDB. As ações de nivelamento são executadas automaticamente pelo motorista. Como alternativa, você pode usar sp_data_source_objects (Transact-SQL) para detetar o esquema de coleção (colunas) e criar manualmente a tabela externa. O procedimento armazenado sp_data_source_table_columns
também executa automaticamente o nivelamento por meio do driver ODBC do PolyBase para o driver MongoDB. A extensão do Data Virtualization para o Azure Data Studio e sp_data_source_table_columns
usar os mesmos procedimentos armazenados internos para consultar o esquema externo.
Bloqueio
Bloqueio compartilhado no objeto SCHEMARESOLUTION.
Segurança
Os arquivos de dados de uma tabela externa são armazenados no Hadoop ou no Armazenamento de Blobs do Azure. Esses arquivos de dados são criados e gerenciados por seus próprios processos. É da sua responsabilidade gerir a segurança dos dados externos.
Exemplos
Um. Criar uma tabela externa com dados em formato delimitado por texto
Este exemplo mostra todas as etapas necessárias para criar uma tabela externa com dados formatados em arquivos delimitados por texto. Ele define uma fonte de dados externa mydatasource e um formato de arquivo externo myfileformat. Esses objetos no nível de banco de dados são referenciados na instrução CREATE EXTERNAL TABLE. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.
CREATE EXTERNAL DATA SOURCE mydatasource
WITH (
TYPE = HADOOP,
LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
)
CREATE EXTERNAL FILE FORMAT myfileformat
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS (FIELD_TERMINATOR ='|')
);
CREATE EXTERNAL TABLE ClickStream (
url varchar(50),
event_date date,
user_IP varchar(50)
)
WITH (
LOCATION='/webdata/employee.tbl',
DATA_SOURCE = mydatasource,
FILE_FORMAT = myfileformat
)
;
B. Criar uma tabela externa com dados em formato RCFile
Este exemplo mostra todas as etapas necessárias para criar uma tabela externa que tenha dados formatados como RCFiles. Ele define uma fonte de dados externa mydatasource_rc e um formato de arquivo externo myfileformat_rc. Esses objetos no nível de banco de dados são referenciados na instrução CREATE EXTERNAL TABLE. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.
CREATE EXTERNAL DATA SOURCE mydatasource_rc
WITH (
TYPE = HADOOP,
LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
)
CREATE EXTERNAL FILE FORMAT myfileformat_rc
WITH (
FORMAT_TYPE = RCFILE,
SERDE_METHOD = 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
)
;
CREATE EXTERNAL TABLE ClickStream_rc (
url varchar(50),
event_date date,
user_ip varchar(50)
)
WITH (
LOCATION='/webdata/employee_rc.tbl',
DATA_SOURCE = mydatasource_rc,
FILE_FORMAT = myfileformat_rc
)
;
C. Criar uma tabela externa com dados em formato ORC
Este exemplo mostra todas as etapas necessárias para criar uma tabela externa que tenha dados formatados como arquivos ORC. Ele define uma fonte de dados externa mydatasource_orc e um formato de arquivo externo myfileformat_orc. Esses objetos no nível de banco de dados são referenciados na instrução CREATE EXTERNAL TABLE. Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE e CREATE EXTERNAL FILE FORMAT.
CREATE EXTERNAL DATA SOURCE mydatasource_orc
WITH (
TYPE = HADOOP,
LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
)
CREATE EXTERNAL FILE FORMAT myfileformat_orc
WITH (
FORMAT = ORC,
COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
)
;
CREATE EXTERNAL TABLE ClickStream_orc (
url varchar(50),
event_date date,
user_ip varchar(50)
)
WITH (
LOCATION='/webdata/',
DATA_SOURCE = mydatasource_orc,
FILE_FORMAT = myfileformat_orc
)
;
D. Consultar dados do Hadoop
ClickStream
é uma tabela externa que se conecta ao arquivo de texto delimitado employee.tbl
em um cluster Hadoop. A consulta a seguir se parece com uma consulta em relação a uma tabela padrão. No entanto, essa consulta recupera dados do Hadoop e, em seguida, calcula os resultados.
SELECT TOP 10 (url) FROM ClickStream WHERE user_ip = 'xxx.xxx.xxx.xxx';
E. Unir dados do Hadoop com dados SQL
Esta consulta se parece com um JOIN padrão em duas tabelas SQL. A diferença é que o PolyBase recupera os dados do fluxo de cliques do Hadoop e, em seguida, os une à tabela UrlDescription
. Uma tabela é uma tabela externa e a outra é uma tabela SQL padrão.
SELECT url.description
FROM ClickStream cs
JOIN UrlDescription url ON cs.url = url.name
WHERE cs.url = 'msdn.microsoft.com';
F. Importar dados do Hadoop para uma tabela SQL
Este exemplo cria um novo ms_user
de tabela SQL que armazena permanentemente o resultado de uma associação entre o user
de tabela SQL padrão e a tabela externa ClickStream
.
SELECT DISTINCT user.FirstName, user.LastName
INTO ms_user
FROM user INNER JOIN (
SELECT * FROM ClickStream WHERE cs.url = 'www.microsoft.com'
) AS ms
ON user.user_ip = ms.user_ip;
G. Criar uma tabela externa para o SQL Server
Antes de criar uma credencial com escopo de banco de dados, o banco de dados de usuário deve ter uma chave mestra para proteger a credencial. Para obter mais informações, consulte CREATE MASTER KEY e CREATE DATABASE SCOPED CREDENTIAL.
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'S0me!nfo';
GO
/* specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL SqlServerCredentials
WITH IDENTITY = 'username', Secret = 'password';
GO
Crie uma nova fonte de dados externa chamada SQLServerInstance
e uma tabela externa chamada sqlserver.customer
:
/* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE SQLServerInstance
WITH (
LOCATION = 'sqlserver://SqlServer',
-- PUSHDOWN = ON | OFF,
CREDENTIAL = SQLServerCredentials
);
GO
CREATE SCHEMA sqlserver;
GO
/* LOCATION: sql server table/view in 'database_name.schema_name.object_name' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE sqlserver.customer(
C_CUSTKEY INT NOT NULL,
C_NAME VARCHAR(25) NOT NULL,
C_ADDRESS VARCHAR(40) NOT NULL,
C_NATIONKEY INT NOT NULL,
C_PHONE CHAR(15) NOT NULL,
C_ACCTBAL DECIMAL(15,2) NOT NULL,
C_MKTSEGMENT CHAR(10) NOT NULL,
C_COMMENT VARCHAR(117) NOT NULL
)
WITH (
LOCATION='tpch_10.dbo.customer',
DATA_SOURCE=SqlServerInstance
);
Eu. Criar uma tabela externa para Oracle
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH IDENTITY = 'username', Secret = 'password';
/*
* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
LOCATION = 'oracle://<server address>[:<port>]',
-- PUSHDOWN = ON | OFF,
CREDENTIAL = credential_name)
/*
* LOCATION: Oracle table/view in '<database_name>.<schema_name>.<object_name>' format. Note this may be case sensitive in the Oracle database.
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customers(
[O_ORDERKEY] DECIMAL(38) NOT NULL,
[O_CUSTKEY] DECIMAL(38) NOT NULL,
[O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
[O_TOTALPRICE] DECIMAL(15,2) NOT NULL,
[O_ORDERDATE] DATETIME2(0) NOT NULL,
[O_ORDERPRIORITY] CHAR(15) COLLATE Latin1_General_BIN NOT NULL,
[O_CLERK] CHAR(15) COLLATE Latin1_General_BIN NOT NULL,
[O_SHIPPRIORITY] DECIMAL(38) NOT NULL,
[O_COMMENT] VARCHAR(79) COLLATE Latin1_General_BIN NOT NULL
)
WITH (
LOCATION='DB1.mySchema.customer',
DATA_SOURCE= external_data_source_name
);
J. Criar uma tabela externa para Teradata
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH IDENTITY = 'username', Secret = 'password';
/* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
LOCATION = teradata://<server address>[:<port>],
-- PUSHDOWN = ON | OFF,
CREDENTIAL =credential_name
);
/* LOCATION: Teradata table/view in '<database_name>.<object_name>' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customer(
L_ORDERKEY INT NOT NULL,
L_PARTKEY INT NOT NULL,
L_SUPPKEY INT NOT NULL,
L_LINENUMBER INT NOT NULL,
L_QUANTITY DECIMAL(15,2) NOT NULL,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
L_DISCOUNT DECIMAL(15,2) NOT NULL,
L_TAX DECIMAL(15,2) NOT NULL,
L_RETURNFLAG CHAR NOT NULL,
L_LINESTATUS CHAR NOT NULL,
L_SHIPDATE DATE NOT NULL,
L_COMMITDATE DATE NOT NULL,
L_RECEIPTDATE DATE NOT NULL,
L_SHIPINSTRUCT CHAR(25) NOT NULL,
L_SHIPMODE CHAR(10) NOT NULL,
L_COMMENT VARCHAR(44) NOT NULL
)
WITH (
LOCATION='customer',
DATA_SOURCE= external_data_source_name
);
K. Criar uma tabela externa para o MongoDB
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH IDENTITY = 'username', Secret = 'password';
/* LOCATION: Location string should be of format '<type>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
LOCATION = mongodb://<server>[:<port>],
-- PUSHDOWN = ON | OFF,
CREDENTIAL = credential_name
);
/* LOCATION: MongoDB table/view in '<database_name>.<schema_name>.<object_name>' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customers(
[O_ORDERKEY] DECIMAL(38) NOT NULL,
[O_CUSTKEY] DECIMAL(38) NOT NULL,
[O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
[O_TOTALPRICE] DECIMAL(15,2) NOT NULL,
[O_ORDERDATE] DATETIME2(0) NOT NULL,
[O_COMMENT] VARCHAR(79) COLLATE Latin1_General_BIN NOT NULL
)
WITH (
LOCATION='customer',
DATA_SOURCE= external_data_source_name
);
L. Consultar o armazenamento de objetos compatíveis com o S3 através de uma tabela externa
Aplica-se a: SQL Server 2022 (16.x) e posterior
O exemplo a seguir demonstra o uso do T-SQL para consultar um arquivo parquet armazenado no armazenamento de objetos compatível com o S3 por meio da consulta de tabela externa. O exemplo usa um caminho relativo dentro da fonte de dados externa.
CREATE EXTERNAL DATA SOURCE s3_ds
WITH
( LOCATION = 's3://<ip_address>:<port>/'
, CREDENTIAL = s3_dc
);
GO
CREATE EXTERNAL FILE FORMAT ParquetFileFormat WITH(FORMAT_TYPE = PARQUET);
GO
CREATE EXTERNAL TABLE Region(
r_regionkey BIGINT,
r_name CHAR(25),
r_comment VARCHAR(152) )
WITH (LOCATION = '/region/', DATA_SOURCE = 's3_ds',
FILE_FORMAT = ParquetFileFormat);
GO
Próximos passos
Saiba mais sobre conceitos relacionados nos seguintes artigos:
* Banco de Dados SQL do Azure *
Plataforma de análise
Sistema (PDW)
Visão geral: Banco de Dados SQL do Azure
No Banco de Dados SQL do Azure, cria uma tabela externa para consultas elásticas (em visualização).
Consulte também CREATE EXTERNAL DATA SOURCE.
Sintaxe
-- Create a table for use with elastic query
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ ,...n ] )
WITH ( <sharded_external_table_options> )
[;]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<sharded_external_table_options> ::=
DATA_SOURCE = external_data_source_name,
SCHEMA_NAME = N'nonescaped_schema_name',
OBJECT_NAME = N'nonescaped_object_name',
[DISTRIBUTION = SHARDED(sharding_column_name) | REPLICATED | ROUND_ROBIN]]
)
[;]
Argumentos
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
O nome de uma a três partes da tabela a ser criada. Para uma tabela externa, o SQL armazena apenas os metadados da tabela, juntamente com estatísticas básicas sobre o arquivo ou pasta referenciado no Banco de Dados SQL do Azure. Nenhum dado real é movido ou armazenado no Banco de Dados SQL do Azure.
Importante
Para obter o melhor desempenho, se o driver da fonte de dados externa oferecer suporte a um nome de três partes, é altamente recomendável fornecer o nome de três partes.
<column_definition> [ ,...n ]
CREATE EXTERNAL TABLE suporta a capacidade de configurar o nome da coluna, o tipo de dados, a anulabilidade e o agrupamento. Não é possível usar a RESTRIÇÃO PADRÃO em tabelas externas.
Observação
Text
, nText
e XML
não são tipos de dados com suporte para colunas em tabelas externas do Banco de Dados SQL do Azure.
As definições de coluna, incluindo os tipos de dados e o número de colunas, devem corresponder aos dados nos arquivos externos. Se houver uma incompatibilidade, as linhas do arquivo serão rejeitadas ao consultar os dados reais.
Opções de tabela externa fragmentada
Especifica a fonte de dados externa (uma fonte de dados que não seja do SQL Server) e um método de distribuição para a consulta Elastic.
DATA_SOURCE
A cláusula DATA_SOURCE define a fonte de dados externa (um mapa de estilhaços) que é usada para a tabela externa. Para obter um exemplo, consulte Criar tabelas externas.
Importante
O Banco de Dados SQL do Azure dá suporte à criação de tabelas externas para os tipos RDMS e SHARD_MAP_MANAGER de FONTE DE DADOS EXTERNA. O Banco de Dados SQL do Azure não dá suporte à criação de tabelas externas para o Armazenamento de Blobs do Azure.
SCHEMA_NAME e OBJECT_NAME
As cláusulas SCHEMA_NAME e OBJECT_NAME mapeiam a definição de tabela externa para uma tabela em um esquema diferente. Se omitido, o esquema do objeto remoto é assumido como "dbo" e seu nome é assumido como idêntico ao nome da tabela externa que está sendo definida. Isso é útil se o nome da tabela remota já estiver no banco de dados onde você deseja criar a tabela externa. Por exemplo, você deseja definir uma tabela externa para obter uma exibição agregada de exibições de catálogo ou DMVs em sua camada de dados dimensionada. Como as exibições de catálogo e DMVs já existem localmente, não é possível usar seus nomes para a definição de tabela externa. Em vez disso, use um nome diferente e use a visualização do catálogo ou o nome do Detran nas cláusulas SCHEMA_NAME e/ou OBJECT_NAME. Para obter um exemplo, consulte Criar tabelas externas.
DISTRIBUIÇÃO
Opcional. Esse argumento só é necessário para bancos de dados do tipo SHARD_MAP_MANAGER. Esse argumento controla se uma tabela é tratada como uma tabela fragmentada ou uma tabela replicada. Com tabelas SHARDED (nome da coluna), os dados de tabelas diferentes não se sobrepõem. REPLICATED especifica que as tabelas têm os mesmos dados em todos os fragmentos. ROUND_ROBIN indica que um método específico do aplicativo é usado para distribuir os dados.
A cláusula DISTRIBUTION especifica a distribuição de dados usada para esta tabela. O processador de consultas utiliza as informações fornecidas na cláusula DISTRIBUTION para criar os planos de consulta mais eficientes.
- SHARDED significa que os dados são particionados horizontalmente entre os bancos de dados. A chave de particionamento para a distribuição de dados é o parâmetro
sharding_column_name
. - REPLICADO significa que cópias idênticas da tabela estão presentes em cada banco de dados. É sua responsabilidade garantir que as réplicas sejam idênticas nos bancos de dados.
- ROUND_ROBIN significa que a tabela é particionada horizontalmente usando um método de distribuição dependente do aplicativo.
Permissões
Os usuários com acesso à tabela externa obtêm automaticamente acesso às tabelas remotas subjacentes sob a credencial fornecida na definição de fonte de dados externa. Evite a elevação indesejada de privilégios por meio da credencial da fonte de dados externa. Use GRANT ou REVOKE para uma tabela externa como se fosse uma tabela normal. Depois de definir sua fonte de dados externa e suas tabelas externas, agora você pode usar o T-SQL completo sobre suas tabelas externas.
Tratamento de erros
Ao executar a instrução CREATE EXTERNAL TABLE, se a tentativa de conexão falhar, a instrução falhará e a tabela externa não será criada. Pode levar um minuto ou mais para que o comando falhe, já que o Banco de dados SQL tenta novamente a conexão antes de eventualmente falhar na consulta.
Comentários
Em cenários de consulta ad hoc, como SELECT FROM EXTERNAL TABLE, O Banco de dados SQL armazena as linhas recuperadas da fonte de dados externa em uma tabela temporária. Após a conclusão da consulta, o Banco de dados SQL remove e exclui a tabela temporária. Nenhum dado permanente é armazenado em tabelas SQL.
Por outro lado, no cenário de importação, como SELECT INTO FROM EXTERNAL TABLE, O Banco de dados SQL armazena as linhas recuperadas da fonte de dados externa como dados permanentes na tabela SQL. A nova tabela é criada durante a execução da consulta quando o Banco de dados SQL recupera os dados externos.
Você pode criar muitas tabelas externas que fazem referência à mesma fonte de dados externa ou a fontes de dados externas diferentes.
Você pode criar várias tabelas externas que fazem referência a diferentes fontes de dados externas.
Limitações
Semântica de isolamento: O acesso aos dados por meio de uma tabela externa não adere à semântica de isolamento no SQL Server. Isso significa que consultar uma tabela externa não impõe nenhum bloqueio ou isolamento de instantâneo. Portanto, o retorno de dados pode mudar se os dados na fonte de dados externa estiverem mudando. A mesma consulta pode retornar resultados diferentes cada vez que é executada em uma tabela externa. Da mesma forma, uma consulta pode falhar se os dados externos forem movidos ou removidos.
Construções e operações não suportadas:
Somente predicados literais: Somente predicados literais definidos em uma consulta podem ser enviados para a fonte de dados externa. Isso é diferente dos servidores vinculados e do acesso onde os predicados determinados durante a execução da consulta podem ser usados, ou seja, quando usados em conjunto com um loop aninhado em um plano de consulta. Isso geralmente levará a que toda a tabela externa seja copiada localmente e, em seguida, unida.
No exemplo a seguir, se
External.Orders
for uma tabela externa eCustomer
for uma tabela local, a consulta copiará toda a tabela externa localmente porque o predicado necessário não é conhecido em tempo de compilação.SELECT Orders.OrderId, Orders.OrderTotal FROM External.Orders WHERE CustomerId IN ( SELECT TOP 1 CustomerId FROM Customer WHERE CustomerName = 'MyCompany' );
Sem paralelismo: O uso de tabelas externas impede o uso de paralelismo no plano de consulta.
Executado como consulta remota: As tabelas externas são implementadas como consulta remota, de modo que o número estimado de linhas retornadas é geralmente 1000. Existem outras regras baseadas no tipo de predicado usado para filtrar a tabela externa. São estimativas baseadas em regras e não estimativas baseadas nos dados reais do quadro externo. O otimizador não acessa a fonte de dados remota para obter uma estimativa mais precisa.
Não suportado parade ponto de extremidade privado: As consultas de tabela externa não são suportadas quando a conexão com a tabela remota é um ponto de extremidade privado.
Limitações do tipo de dados
Os seguintes tipos de dados não podem ser usados em tabelas externas do PolyBase:
geography
geometry
hierarchyid
image
text
nText
xml
- Qualquer tipo definido pelo usuário
Bloqueio
Bloqueio compartilhado no objeto SCHEMARESOLUTION.
Exemplos
Um. Criar tabela externa para o Banco de Dados SQL do Azure
CREATE EXTERNAL TABLE [dbo].[CustomerInformation]
( [CustomerID] [int] NOT NULL,
[CustomerName] [varchar](50) NOT NULL,
[Company] [varchar](50) NOT NULL)
WITH
( DATA_SOURCE = MyElasticDBQueryDataSrc)
B. Criar uma tabela externa para uma fonte de dados fragmentada
Este exemplo remapeia um Detran remoto para uma tabela externa usando as cláusulas SCHEMA_NAME e OBJECT_NAME.
CREATE EXTERNAL TABLE [dbo].[all_dm_exec_requests]([session_id] smallint NOT NULL,
[request_id] int NOT NULL,
[start_time] datetime NOT NULL,
[status] nvarchar(30) NOT NULL,
[command] nvarchar(32) NOT NULL,
[sql_handle] varbinary(64),
[statement_start_offset] int,
[statement_end_offset] int,
[cpu_time] int NOT NULL)
WITH
(
DATA_SOURCE = MyExtSrc,
SCHEMA_NAME = 'sys',
OBJECT_NAME = 'dm_exec_requests',
DISTRIBUTION=ROUND_ROBIN
);
Próximos passos
Saiba mais sobre tabelas externas no Banco de Dados SQL do Azure nos seguintes artigos:
- Visão geral da consulta elástica do Banco de Dados SQL do Azure
- Geração de relatórios em bancos de dados em nuvem expandidos
- Introdução às consultas entre bancos de dados (particionamento vertical)
* Sinapse do Azure
Análise *
Plataforma de análise
Sistema (PDW)
Visão geral: Azure Synapse Analytics
Use uma tabela externa para:
- Pools SQL dedicados podem consultar, importar e armazenar dados do Hadoop, do Armazenamento de Blobs do Azure e do Azure Data Lake Storage Gen1 e Gen2.
- Os pools SQL sem servidor podem consultar, importar e armazenar dados do Armazenamento de Blobs do Azure, do Azure Data Lake Storage Gen1 e do Gen2. Serverless não suporta
TYPE=Hadoop
.
Consulte também CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.
Para obter mais orientações e exemplos sobre como usar tabelas externas com o Azure Synapse, consulte Usar tabelas externas com o Synapse SQL.
Sintaxe
- pool SQL dedicado
- do pool SQL sem servidor
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ ,...n ] )
WITH (
LOCATION = 'hdfs_folder_or_filepath',
DATA_SOURCE = external_data_source_name,
FILE_FORMAT = external_file_format_name
[ , <reject_options> [ ,...n ] ]
)
[;]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<reject_options> ::=
{
| REJECT_TYPE = value | percentage,
| REJECT_VALUE = reject_value,
| REJECT_SAMPLE_VALUE = reject_sample_value,
| REJECTED_ROW_LOCATION = '/REJECT_Directory'
}
Argumentos
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
O nome de uma a três partes da tabela a ser criada. Para uma tabela externa, apenas os metadados da tabela, juntamente com estatísticas básicas sobre o arquivo ou pasta referenciados no Azure Data Lake, Hadoop ou Armazenamento de Blobs do Azure. Nenhum dado real é movido ou armazenado quando tabelas externas são criadas.
Importante
Para obter o melhor desempenho, se o driver da fonte de dados externa oferecer suporte a um nome de três partes, é altamente recomendável fornecer o nome de três partes.
<column_definition> [ ,...n ]
CREATE EXTERNAL TABLE suporta a capacidade de configurar o nome da coluna, o tipo de dados, a anulabilidade e o agrupamento. Não é possível usar a RESTRIÇÃO PADRÃO em tabelas externas.
Observação
Tipos de dados preteridos text
, ntext
e XML
não são tipos de dados suportados para colunas em tabelas externas para Synapse Analytics.
- Ao ler arquivos delimitados, as definições de coluna, incluindo os tipos de dados e o número de colunas, devem corresponder aos dados nos arquivos externos. Se houver uma incompatibilidade, as linhas do arquivo serão rejeitadas ao consultar os dados reais.
- Ao ler a partir de arquivos do Parquet, você pode especificar apenas as colunas que deseja ler e ignorar o resto.
LOCALIZAÇÃO = 'folder_or_filepath'
Especifica a pasta ou o caminho do arquivo e o nome do arquivo para os dados reais no Azure Data Lake, Hadoop ou Armazenamento de Blob do Azure. O local começa a partir da pasta raiz. A pasta raiz é o local de dados especificado na fonte de dados externa. A instrução CREATE EXTERNAL TABLE AS SELECT cria o caminho e a pasta se ela não existir.
CREATE EXTERNAL TABLE
não cria o caminho e a pasta.
Se você especificar LOCATION como uma pasta, uma consulta PolyBase selecionada na tabela externa recuperará arquivos da pasta e de todas as suas subpastas. Assim como o Hadoop, o PolyBase não retorna pastas ocultas. Ele também não retorna arquivos para os quais o nome do arquivo começa com um sublinhado (_) ou um ponto (.).
No exemplo de imagem a seguir, se LOCATION='/webdata/'
, uma consulta PolyBase retornará linhas de mydata.txt
e mydata2.txt
. Ele não retornará mydata3.txt
porque está em uma subpasta de uma pasta oculta. E ele não retornará _hidden.txt
porque é um arquivo oculto.
Ao contrário das tabelas externas do Hadoop, as tabelas externas nativas não retornam subpastas, a menos que você especifique /**
no final do caminho. Neste exemplo, se LOCATION='/webdata/'
, uma consulta de pool SQL sem servidor, retornará linhas de mydata.txt. Ele não retornará mydata2.txt e mydata3.txt porque eles estão localizados em uma subpasta. As tabelas Hadoop retornarão todos os arquivos dentro de qualquer subpasta.
Tanto o Hadoop quanto as tabelas externas nativas ignorarão os arquivos com os nomes que começam com um sublinhado (_) ou um ponto (.).
DATA_SOURCE = external_data_source_name
Especifica o nome da fonte de dados externa que contém o local dos dados externos. Este local fica no Azure Data Lake. Para criar uma fonte de dados externa, use CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Especifica o nome do objeto de formato de arquivo externo que armazena o tipo de arquivo e o método de compactação para os dados externos. Para criar um formato de arquivo externo, use CREATE EXTERNAL FILE FORMAT.
TABLE_OPTIONS
Especifica o conjunto de opções que descrevem como ler os arquivos subjacentes. Atualmente, a única opção disponível é {"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}
que instrui a tabela externa a ignorar as atualizações feitas nos arquivos subjacentes, mesmo que isso possa causar algumas operações de leitura inconsistentes. Utilize esta opção apenas em casos especiais em que tenha acrescentado ficheiros com frequência. Esta opção está disponível no pool SQL sem servidor para o formato CSV.
Opções REJEITAR
As opções de rejeição estão em pré-visualização para pools SQL sem servidor no Azure Synapse Analytics.
Esta opção só pode ser usada com fontes de dados externas onde TYPE = HADOOP.
Você pode especificar parâmetros de rejeição que determinam como o PolyBase lidará com registros de sujos que recupera da fonte de dados externa. Um registo de dados é considerado "sujo" se os tipos de dados reais ou o número de colunas não corresponderem às definições de coluna da tabela externa.
Quando você não especifica ou altera valores de rejeição, o PolyBase usa valores padrão. Essas informações sobre os parâmetros de rejeição são armazenadas como metadados adicionais quando você cria uma tabela externa com a instrução CREATE EXTERNAL TABLE. Quando uma futura instrução SELECT ou uma instrução SELECT INTO SELECT seleciona dados da tabela externa, o PolyBase usará as opções de rejeição para determinar o número ou a porcentagem de linhas que podem ser rejeitadas antes que a consulta real falhe. A consulta retornará resultados (parciais) até que o limite de rejeição seja excedido. Em seguida, ele falha com a mensagem de erro apropriada.
A opção de formato PARSER_VERSION só é suportada em pools SQL sem servidor.
REJECT_TYPE = valor | percentagem
Esclarece se a opção REJECT_VALUE é especificada como um valor literal ou uma porcentagem.
valor
REJECT_VALUE é um valor literal, não uma percentagem. A consulta PolyBase falhará quando o número de linhas rejeitadas exceder reject_value.
Por exemplo, se REJECT_VALUE = 5 e REJECT_TYPE = valor, a consulta PolyBase SELECT falhará após cinco linhas terem sido rejeitadas.
percentagem
REJECT_VALUE é uma percentagem, não um valor literal. Uma consulta PolyBase falhará quando a porcentagem de linhas com falha exceder reject_value. A percentagem de linhas com falha é calculada em intervalos.
REJECT_VALUE = reject_value
Especifica o valor ou a porcentagem de linhas que podem ser rejeitadas antes que a consulta falhe.
- Para REJECT_TYPE = valor, reject_value deve ser um número inteiro entre 0 e 2.147.483.647.
- Para REJECT_TYPE = percentagem, reject_value deve ser um flutuador entre 0 e 100. A porcentagem só é válida para pools SQL dedicados onde
TYPE=HADOOP
.
A consulta falhará quando o número de linhas rejeitadas exceder reject_value. Por exemplo, se REJECT_VALUE = 5 e REJECT_TYPE = valor, a consulta SELECT falhará após cinco linhas terem sido rejeitadas.
REJECT_SAMPLE_VALUE = reject_sample_value
Esse atributo é necessário quando você especifica REJECT_TYPE = porcentagem. Ele determina o número de linhas a serem recuperadas antes que o PolyBase recalcule a porcentagem de linhas rejeitadas.
O parâmetro reject_sample_value deve ser um número inteiro entre 0 e 2.147.483.647.
Por exemplo, se REJECT_SAMPLE_VALUE = 1000, o PolyBase calculará a porcentagem de linhas com falha depois de tentar importar 1000 linhas do arquivo de dados externo. Se a porcentagem de linhas com falha for menor que reject_value, o PolyBase tentará recuperar outras 1000 linhas. Ele continua a recalcular a porcentagem de linhas com falha depois de tentar importar cada 1000 linhas adicionais.
Observação
Como o PolyBase calcula a porcentagem de linhas com falha em intervalos, a porcentagem real de linhas com falha pode exceder reject_value.
Exemplo:
Este exemplo mostra como as três opções REJECT interagem entre si. Por exemplo, se REJECT_TYPE = porcentagem, REJECT_VALUE = 30 e REJECT_SAMPLE_VALUE = 100, o seguinte cenário pode ocorrer:
- O PolyBase tenta recuperar as primeiras 100 linhas; 25 reprovam e 75 conseguem.
- A porcentagem de linhas com falha é calculada como 25%, que é menor do que o valor de rejeição de 30%. Como resultado, o PolyBase continuará recuperando dados da fonte de dados externa.
- O PolyBase tenta carregar as próximas 100 linhas; Desta vez, 25 linhas são bem-sucedidas e 75 linhas falham.
- A porcentagem de linhas com falha é recalculada como 50%. A porcentagem de linhas com falha excedeu o valor de rejeição de 30%.
- A consulta PolyBase falha com 50% linhas rejeitadas depois de tentar retornar as primeiras 200 linhas. Observe que as linhas correspondentes foram retornadas antes que a consulta PolyBase detete que o limite de rejeição foi excedido.
REJECTED_ROW_LOCATION = de Localização do Diretório
Especifica o diretório dentro da Fonte de Dados Externa que as linhas rejeitadas e o arquivo de erro correspondente devem ser gravados.
Se o caminho especificado não existir, ele será criado. Um diretório filho é criado com o nome _rejectedrows
. O caractere _
garante que o diretório seja escapado para outro processamento de dados, a menos que explicitamente nomeado no parâmetro location.
- Em pools SQL sem servidor, o caminho é
YearMonthDay_HourMinuteSecond_StatementID
. Você pode usar a id da instrução para correlacionar a pasta com a consulta que a gerou. - Em pools SQL dedicados, o caminho criado é baseado no tempo de envio de carregamento no formato
YearMonthDay -HourMinuteSecond
, por exemplo,20180330-173205
.
Nesta pasta, dois tipos de arquivos são gravados, o arquivo _reason
e o arquivo de dados.
Para obter mais informações, consulte CREATE EXTERNAL DATA SOURCE.
Os arquivos de motivo e os arquivos de dados têm o queryID associado à instrução CTAS. Como os dados e o motivo estão em arquivos separados, os arquivos correspondentes têm um sufixo correspondente.
Em pools SQL sem servidor, o arquivo error.json
contém uma matriz JSON com erros encontrados relacionados a linhas rejeitadas. Cada elemento que representa o erro contém os seguintes atributos:
Atributo | Descrição |
---|---|
Erro | Razão pela qual a linha é rejeitada. |
Linha | Número ordinal da linha rejeitado no arquivo. |
Coluna | Número ordinal da coluna rejeitado. |
Valor | Valor da coluna rejeitado. Se o valor for maior que 100 caracteres, somente os primeiros 100 caracteres serão exibidos. |
Ficheiro | Caminho para o arquivo ao qual essa linha pertence. |
Permissões
Requer estas permissões de usuário:
- CRIAR TABELA
- ALTERAR QUALQUER ESQUEMA
- ALTERAR QUALQUER FONTE DE DADOS EXTERNA
- ALTERAR QUALQUER FORMATO DE ARQUIVO EXTERNO
Observação
As permissões CONTROL DATABASE são necessárias para criar apenas a CHAVE MESTRA, A CREDENCIAL COM ESCOPO DO BANCO DE DADOS e a FONTE DE DADOS EXTERNA
Observe que o logon que cria a fonte de dados externa deve ter permissão para ler e gravar na fonte de dados externa, localizada no Hadoop ou no Armazenamento de Blobs do Azure.
Importante
A permissão ALTER ANY EXTERNAL DATA SOURCE concede a qualquer entidade de segurança a capacidade de criar e modificar qualquer objeto de fonte de dados externa e, portanto, também concede a capacidade de acessar todas as credenciais de escopo do banco de dados no banco de dados. Essa permissão deve ser considerada altamente privilegiada e, portanto, deve ser concedida apenas a entidades confiáveis no sistema.
Tratamento de erros
Ao executar a instrução CREATE EXTERNAL TABLE, O PolyBase tenta se conectar à fonte de dados externa. Se a tentativa de conexão falhar, a instrução falhará e a tabela externa não será criada. Pode levar um minuto ou mais para que o comando falhe, já que o PolyBase tenta novamente a conexão antes de eventualmente falhar na consulta.
Comentários
Em cenários de consulta ad hoc, como SELECT FROM EXTERNAL TABLE, O PolyBase armazena as linhas recuperadas da fonte de dados externa em uma tabela temporária. Após a conclusão da consulta, o PolyBase remove e exclui a tabela temporária. Nenhum dado permanente é armazenado em tabelas SQL.
Por outro lado, no cenário de importação, como SELECT INTO FROM EXTERNAL TABLE, O PolyBase armazena as linhas recuperadas da fonte de dados externa como dados permanentes na tabela SQL. A nova tabela é criada durante a execução da consulta quando o PolyBase recupera os dados externos.
O PolyBase pode enviar parte da computação da consulta para o Hadoop para melhorar o desempenho da consulta. Esta ação é chamada de pushdown de predicado. Para habilitá-lo, especifique a opção de local do gerenciador de recursos do Hadoop em CREATE EXTERNAL DATA SOURCE.
Você pode criar muitas tabelas externas que fazem referência à mesma fonte de dados externa ou a fontes de dados externas diferentes.
Preste atenção aos dados de origem usando o agrupamento UTF-8. Para quaisquer dados de origem usando o agrupamento UTF-8, você deve fornecer manualmente um agrupamento não-UTF-8 cada coluna UTF-8 na instrução CREATE EXTERNAL TABLE. Isso ocorre porque o suporte a UTF-8 não se estende a tabelas externas. Quando você tenta criar uma tabela externa com um agrupamento UTF-8, você receberá uma mensagem de erro Unsupported collation
. Se o agrupamento de banco de dados da tabela externa for um agrupamento UTF-8, a criação de tabela externa falhará, a menos que você forneça um agrupamento de colunas não UTF-8 explícito, por exemplo, [UTF8_column] varchar(128) COLLATE LATIN1_GENERAL_100_CI_AS_KS_WS NOT NULL,
.
Os pools SQL dedicados e sem servidor no Azure Synapse Analytics usam bases de código diferentes para virtualização de dados. Os pools SQL sem servidor oferecem suporte a uma tecnologia nativa de virtualização de dados. Pools SQL dedicados oferecem suporte à virtualização de dados nativos e PolyBase. A virtualização de dados do PolyBase é usada quando a FONTE DE DADOS EXTERNA é criada com TYPE=HADOOP
.
Limitações e restrições
Como os dados de uma tabela externa não estão sob o controle de gerenciamento direto do Azure Synapse, eles podem ser alterados ou removidos a qualquer momento por um processo externo. Como resultado, não é garantido que os resultados da consulta em uma tabela externa sejam determinísticos. A mesma consulta pode retornar resultados diferentes cada vez que é executada em uma tabela externa. Da mesma forma, uma consulta pode falhar se os dados externos forem movidos ou removidos.
Você pode criar várias tabelas externas que fazem referência a diferentes fontes de dados externas.
Somente estas instruções DDL (Data Definition Language) são permitidas em tabelas externas:
- CRIAR TABELA E SOLTAR TABELA
- CRIAR ESTATÍSTICAS e DROP STATISTICS
- CRIAR VISTA E DROP VIEW
Construções e operações não suportadas:
- A restrição DEFAULT em colunas de tabela externas
- Operações DML (Data Manipulation Language) de exclusão, inserção e atualização
- de mascaramento de dados dinâmicos em colunas de tabelas externas
Limitações de consulta
Recomenda-se não exceder mais de 30k arquivos por pasta. Quando muitos arquivos são referenciados, uma exceção de falta de memória da Java Virtual Machine (JVM) pode ocorrer ou o desempenho pode diminuir.
Limitações de largura da tabela
O PolyBase no Azure Data Warehouse tem um limite de largura de linha de 1 MB com base no tamanho máximo de uma única linha válida por definição de tabela. Se a soma do esquema de coluna for maior que 1 MB, o PolyBase não poderá consultar os dados.
Limitações do tipo de dados
Os seguintes tipos de dados não podem ser usados em tabelas externas do PolyBase:
geography
geometry
hierarchyid
image
text
nText
xml
- Qualquer tipo definido pelo usuário
Bloqueio
Bloqueio compartilhado no objeto SCHEMARESOLUTION.
Exemplos
Um. Importar dados do ADLS Gen 2 para o Azure Synapse Analytics
Para obter exemplos para Gen ADLS Gen 1, consulte Criar fonte de dados externa.
-- These values come from your Azure Active Directory Application used to authenticate to ADLS Gen 2.
CREATE DATABASE SCOPED CREDENTIAL ADLUser
WITH IDENTITY = '<clientID>@\<OAuth2.0TokenEndPoint>',
SECRET = '<KEY>' ;
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (TYPE = HADOOP,
LOCATION = 'abfss://data@pbasetr.azuredatalakestore.net'
);
CREATE EXTERNAL FILE FORMAT TextFileFormat
WITH
(
FORMAT_TYPE = DELIMITEDTEXT
, FORMAT_OPTIONS ( FIELD_TERMINATOR = '|'
, STRING_DELIMITER = ''
, DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss.fff'
, USE_TYPE_DEFAULT = FALSE
)
);
CREATE EXTERNAL TABLE [dbo].[DimProduct_external]
( [ProductKey] [int] NOT NULL,
[ProductLabel] nvarchar NULL,
[ProductName] nvarchar NULL )
WITH
(
LOCATION='/DimProduct/' ,
DATA_SOURCE = AzureDataLakeStore ,
FILE_FORMAT = TextFileFormat ,
REJECT_TYPE = VALUE ,
REJECT_VALUE = 0
);
CREATE TABLE [dbo].[DimProduct]
WITH (DISTRIBUTION = HASH([ProductKey] ) )
AS SELECT * FROM
[dbo].[DimProduct_external] ;
B. Importar dados do Parquet para o Azure Synapse Analytics
O exemplo a seguir cria uma tabela externa. Em seguida, retorna a primeira linha:
CREATE EXTERNAL TABLE census_external_table
(
decennialTime varchar(20),
stateName varchar(100),
countyName varchar(100),
population int,
race varchar(50),
sex varchar(10),
minAge int,
maxAge int
)
WITH (
LOCATION = '/parquet/',
DATA_SOURCE = population_ds,
FILE_FORMAT = census_file_format
);
GO
SELECT TOP 1 * FROM census_external_table;
Próximos passos
Saiba mais sobre tabelas externas e conceitos relacionados nos seguintes artigos:
* Análise
Sistema de plataforma (PDW) *
Visão geral: Analytics Platform System
Use uma tabela externa para:
- Consulte dados do Hadoop ou do Armazenamento de Blobs do Azure com instruções Transact-SQL.
- Importe e armazene dados do Hadoop ou do Armazenamento de Blobs do Azure no Analytics Platform System.
Consulte também CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.
Sintaxe
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ ,...n ] )
WITH (
LOCATION = 'hdfs_folder_or_filepath',
DATA_SOURCE = external_data_source_name,
FILE_FORMAT = external_file_format_name
[ , <reject_options> [ ,...n ] ]
)
[;]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
<reject_options> ::=
{
| REJECT_TYPE = value | percentage,
| REJECT_VALUE = reject_value,
| REJECT_SAMPLE_VALUE = reject_sample_value,
}
Argumentos
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
O nome de uma a três partes da tabela a ser criada. Para uma tabela externa, o Analytics Platform System armazena apenas os metadados da tabela, juntamente com estatísticas básicas sobre o arquivo ou pasta referenciado no Hadoop ou no Armazenamento de Blobs do Azure. Nenhum dado real é movido ou armazenado no Analytics Platform System.
Importante
Para obter o melhor desempenho, se o driver da fonte de dados externa oferecer suporte a um nome de três partes, é altamente recomendável fornecer o nome de três partes.
<column_definition> [ ,...n ]
CREATE EXTERNAL TABLE suporta a capacidade de configurar o nome da coluna, o tipo de dados, a anulabilidade e o agrupamento. Não é possível usar a RESTRIÇÃO PADRÃO em tabelas externas.
As definições de coluna, incluindo os tipos de dados e o número de colunas, devem corresponder aos dados nos arquivos externos. Se houver uma incompatibilidade, as linhas do arquivo serão rejeitadas ao consultar os dados reais.
LOCALIZAÇÃO = 'folder_or_filepath'
Especifica a pasta ou o caminho do arquivo e o nome do arquivo para os dados reais no Hadoop ou no Armazenamento de Blobs do Azure. O local começa a partir da pasta raiz. A pasta raiz é o local de dados especificado na fonte de dados externa.
No Analytics Platform System, a instrução CREATE EXTERNAL TABLE AS SELECT cria o caminho e a pasta se ela não existir.
CREATE EXTERNAL TABLE
não cria o caminho e a pasta.
Se você especificar LOCATION como uma pasta, uma consulta PolyBase selecionada na tabela externa recuperará arquivos da pasta e de todas as suas subpastas. Assim como o Hadoop, o PolyBase não retorna pastas ocultas. Ele também não retorna arquivos para os quais o nome do arquivo começa com um sublinhado (_) ou um ponto (.).
No exemplo de imagem a seguir, se LOCATION='/webdata/'
, uma consulta PolyBase retornará linhas de mydata.txt
e mydata2.txt
. Ele não retornará mydata3.txt
porque está em uma subpasta de uma pasta oculta. E ele não retornará _hidden.txt
porque é um arquivo oculto.
Para alterar o padrão e ler apenas a partir da pasta raiz, defina o atributo <polybase.recursive.traversal>
como 'false' no arquivo de configuração core-site.xml
. Esse arquivo está localizado em <SqlBinRoot>\PolyBase\Hadoop\Conf\
sob a raiz bin
do SQL Server. Por exemplo, C:\Program Files\Microsoft SQL Server\MSSQL13.XD14\MSSQL\Binn\
.
DATA_SOURCE = external_data_source_name
Especifica o nome da fonte de dados externa que contém o local dos dados externos. Esse local é um Hadoop ou um Armazenamento de Blob do Azure. Para criar uma fonte de dados externa, use CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Especifica o nome do objeto de formato de arquivo externo que armazena o tipo de arquivo e o método de compactação para os dados externos. Para criar um formato de arquivo externo, use CREATE EXTERNAL FILE FORMAT.
Opções de rejeição
Esta opção só pode ser usada com fontes de dados externas onde TYPE = HADOOP.
Você pode especificar parâmetros de rejeição que determinam como o PolyBase lidará com registros de sujos que recupera da fonte de dados externa. Um registo de dados é considerado "sujo" se os tipos de dados reais ou o número de colunas não corresponderem às definições de coluna da tabela externa.
Quando você não especifica ou altera valores de rejeição, o PolyBase usa valores padrão. Essas informações sobre os parâmetros de rejeição são armazenadas como metadados adicionais quando você cria uma tabela externa com a instrução CREATE EXTERNAL TABLE. Quando uma futura instrução SELECT ou uma instrução SELECT INTO SELECT seleciona dados da tabela externa, o PolyBase usará as opções de rejeição para determinar o número ou a porcentagem de linhas que podem ser rejeitadas antes que a consulta real falhe. A consulta retornará resultados (parciais) até que o limite de rejeição seja excedido. Em seguida, ele falha com a mensagem de erro apropriada.
REJECT_TYPE = valor | percentagem
Esclarece se a opção REJECT_VALUE é especificada como um valor literal ou uma porcentagem.
valor
REJECT_VALUE é um valor literal, não uma percentagem. A consulta PolyBase falhará quando o número de linhas rejeitadas exceder reject_value.
Por exemplo, se REJECT_VALUE = 5 e REJECT_TYPE = valor, a consulta PolyBase SELECT falhará após cinco linhas terem sido rejeitadas.
percentagem
REJECT_VALUE é uma percentagem, não um valor literal. Uma consulta PolyBase falhará quando a porcentagem de linhas com falha exceder reject_value. A percentagem de linhas com falha é calculada em intervalos.
REJECT_VALUE = reject_value
Especifica o valor ou a porcentagem de linhas que podem ser rejeitadas antes que a consulta falhe.
Para REJECT_TYPE = valor, reject_value deve ser um número inteiro entre 0 e 2.147.483.647.
Para REJECT_TYPE = percentagem, reject_value deve ser um flutuador entre 0 e 100.
REJECT_SAMPLE_VALUE = reject_sample_value
Esse atributo é necessário quando você especifica REJECT_TYPE = porcentagem. Ele determina o número de linhas a serem recuperadas antes que o PolyBase recalcule a porcentagem de linhas rejeitadas.
O parâmetro reject_sample_value deve ser um número inteiro entre 0 e 2.147.483.647.
Por exemplo, se REJECT_SAMPLE_VALUE = 1000, o PolyBase calculará a porcentagem de linhas com falha depois de tentar importar 1000 linhas do arquivo de dados externo. Se a porcentagem de linhas com falha for menor que reject_value, o PolyBase tentará recuperar outras 1000 linhas. Ele continua a recalcular a porcentagem de linhas com falha depois de tentar importar cada 1000 linhas adicionais.
Observação
Como o PolyBase calcula a porcentagem de linhas com falha em intervalos, a porcentagem real de linhas com falha pode exceder reject_value.
Exemplo:
Este exemplo mostra como as três opções REJECT interagem entre si. Por exemplo, se REJECT_TYPE = porcentagem, REJECT_VALUE = 30 e REJECT_SAMPLE_VALUE = 100, o seguinte cenário pode ocorrer:
- O PolyBase tenta recuperar as primeiras 100 linhas; 25 reprovam e 75 conseguem.
- A porcentagem de linhas com falha é calculada como 25%, que é menor do que o valor de rejeição de 30%. Como resultado, o PolyBase continuará recuperando dados da fonte de dados externa.
- O PolyBase tenta carregar as próximas 100 linhas; Desta vez, 25 linhas são bem-sucedidas e 75 linhas falham.
- A porcentagem de linhas com falha é recalculada como 50%. A porcentagem de linhas com falha excedeu o valor de rejeição de 30%.
- A consulta PolyBase falha com 50% linhas rejeitadas depois de tentar retornar as primeiras 200 linhas. Observe que as linhas correspondentes foram retornadas antes que a consulta PolyBase detete que o limite de rejeição foi excedido.
Permissões
Requer estas permissões de usuário:
- CRIAR TABELA
- ALTERAR QUALQUER ESQUEMA
- ALTERAR QUALQUER FONTE DE DADOS EXTERNA
- ALTERAR QUALQUER FORMATO DE ARQUIVO EXTERNO
- BANCO DE DADOS DE CONTROLE
Observe que o logon que cria a fonte de dados externa deve ter permissão para ler e gravar na fonte de dados externa, localizada no Hadoop ou no Armazenamento de Blobs do Azure.
Importante
A permissão ALTER ANY EXTERNAL DATA SOURCE concede a qualquer entidade de segurança a capacidade de criar e modificar qualquer objeto de fonte de dados externa e, portanto, também concede a capacidade de acessar todas as credenciais de escopo do banco de dados no banco de dados. Essa permissão deve ser considerada altamente privilegiada e, portanto, deve ser concedida apenas a entidades confiáveis no sistema.
Tratamento de erros
Ao executar a instrução CREATE EXTERNAL TABLE, O PolyBase tenta se conectar à fonte de dados externa. Se a tentativa de conexão falhar, a instrução falhará e a tabela externa não será criada. Pode levar um minuto ou mais para que o comando falhe, já que o PolyBase tenta novamente a conexão antes de eventualmente falhar na consulta.
Comentários
Em cenários de consulta ad hoc, como SELECT FROM EXTERNAL TABLE, O PolyBase armazena as linhas recuperadas da fonte de dados externa em uma tabela temporária. Após a conclusão da consulta, o PolyBase remove e exclui a tabela temporária. Nenhum dado permanente é armazenado em tabelas SQL.
Por outro lado, no cenário de importação, como SELECT INTO FROM EXTERNAL TABLE, O PolyBase armazena as linhas recuperadas da fonte de dados externa como dados permanentes na tabela SQL. A nova tabela é criada durante a execução da consulta quando o PolyBase recupera os dados externos.
O PolyBase pode enviar parte da computação da consulta para o Hadoop para melhorar o desempenho da consulta. Esta ação é chamada de pushdown de predicado. Para habilitá-lo, especifique a opção de local do gerenciador de recursos do Hadoop em CREATE EXTERNAL DATA SOURCE.
Você pode criar muitas tabelas externas que fazem referência à mesma fonte de dados externa ou a fontes de dados externas diferentes.
Limitações e restrições
Como os dados de uma tabela externa não estão sob o controle direto de gerenciamento do aparelho, eles podem ser alterados ou removidos a qualquer momento por um processo externo. Como resultado, não é garantido que os resultados da consulta em uma tabela externa sejam determinísticos. A mesma consulta pode retornar resultados diferentes cada vez que é executada em uma tabela externa. Da mesma forma, uma consulta pode falhar se os dados externos forem movidos ou removidos.
Você pode criar várias tabelas externas que fazem referência a diferentes fontes de dados externas. Se você executar consultas simultaneamente em diferentes fontes de dados Hadoop, cada fonte Hadoop deverá usar a mesma definição de configuração do servidor 'conectividade hadoop'. Por exemplo, não é possível executar simultaneamente uma consulta em um cluster Hadoop do Cloudera e em um cluster Hadoop do Hortonworks, pois eles usam definições de configuração diferentes. Para obter as definições de configuração e as combinações suportadas, consulte PolyBase Connectivity Configuration.
Somente estas instruções DDL (Data Definition Language) são permitidas em tabelas externas:
- CRIAR TABELA E SOLTAR TABELA
- CRIAR ESTATÍSTICAS e DROP STATISTICS
- CRIAR VISTA E DROP VIEW
Construções e operações não suportadas:
- A restrição DEFAULT em colunas de tabela externas
- Operações DML (Data Manipulation Language) de exclusão, inserção e atualização
- de mascaramento de dados dinâmicos em colunas de tabelas externas
Limitações de consulta
O PolyBase pode consumir um máximo de 33 mil arquivos por pasta ao executar 32 consultas PolyBase simultâneas. Este número máximo inclui ficheiros e subpastas em cada pasta HDFS. Se o grau de simultaneidade for inferior a 32, um usuário pode executar consultas PolyBase em pastas no HDFS que contenham mais de 33k arquivos. Recomendamos que você mantenha os caminhos de arquivos externos curtos e não use mais de 30 mil arquivos por pasta HDFS. Quando muitos arquivos são referenciados, uma exceção de falta de memória da Java Virtual Machine (JVM) pode ocorrer.
Limitações de largura da tabela
O PolyBase no SQL Server 2016 tem um limite de largura de linha de 32 KB com base no tamanho máximo de uma única linha válida por definição de tabela. Se a soma do esquema de coluna for maior que 32 KB, o PolyBase não poderá consultar os dados.
No Azure Synapse Analytics, essa limitação foi aumentada para 1 MB.
Limitações do tipo de dados
Os seguintes tipos de dados não podem ser usados em tabelas externas do PolyBase:
geography
geometry
hierarchyid
image
text
nText
xml
- Qualquer tipo definido pelo usuário
Bloqueio
Bloqueio compartilhado no objeto SCHEMARESOLUTION.
Segurança
Os arquivos de dados de uma tabela externa são armazenados no Hadoop ou no Armazenamento de Blobs do Azure. Esses arquivos de dados são criados e gerenciados por seus próprios processos. É da sua responsabilidade gerir a segurança dos dados externos.
Exemplos
Um. Junte dados do HDFS aos dados do Analytics Platform System
SELECT cs.user_ip FROM ClickStream cs
JOIN [User] u ON cs.user_ip = u.user_ip
WHERE cs.url = 'www.microsoft.com';
B. Importar dados de linha do HDFS para uma tabela distribuída do Analytics Platform System
CREATE TABLE ClickStream_PDW
WITH ( DISTRIBUTION = HASH (url) )
AS SELECT url, event_date, user_ip FROM ClickStream;
C. Importar dados de linha do HDFS para uma tabela replicada do Analytics Platform System
CREATE TABLE ClickStream_PDW
WITH ( DISTRIBUTION = REPLICATE )
AS SELECT url, event_date, user_ip
FROM ClickStream;
Próximos passos
Saiba mais sobre tabelas externas no Analytics Platform System nos seguintes artigos:
* Instância Gerenciada SQL do Azure *
Plataforma de análise
Sistema (PDW)
Visão geral: Instância gerenciada SQL do Azure
Cria uma tabela de dados externos na Instância Gerenciada SQL do Azure. Para obter informações completas, consulte Virtualização de dados com a Instância Gerenciada SQL do Azure.
A virtualização de dados na Instância Gerenciada SQL do Azure fornece acesso a dados externos em uma variedade de formatos de arquivo no Azure Data Lake Storage Gen2 ou no Armazenamento de Blobs do Azure e, para consultá-los com instruções T-SQL, até mesmo combinar dados com dados relacionais armazenados localmente usando junções.
Consulte também CREATE EXTERNAL DATA SOURCE e DROP EXTERNAL TABLE.
Sintaxe
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
( <column_definition> [ ,...n ] )
WITH (
LOCATION = 'filepath',
DATA_SOURCE = external_data_source_name,
FILE_FORMAT = external_file_format_name
)
[;]
<column_definition> ::=
column_name <data_type>
[ COLLATE collation_name ]
[ NULL | NOT NULL ]
Argumentos
{ database_name.schema_name.table_name | schema_name.table_name | table_name }
O nome de uma a três partes da tabela a ser criada. Para uma tabela externa, apenas os metadados da tabela, juntamente com estatísticas básicas sobre o arquivo ou pasta referenciada no Azure Data Lake ou no Armazenamento de Blobs do Azure. Nenhum dado real é movido ou armazenado quando tabelas externas são criadas.
Importante
Para obter o melhor desempenho, se o driver da fonte de dados externa oferecer suporte a um nome de três partes, é altamente recomendável fornecer o nome de três partes.
<column_definition> [ ,...n ]
CREATE EXTERNAL TABLE suporta a capacidade de configurar o nome da coluna, o tipo de dados, a anulabilidade e o agrupamento. Não é possível usar a RESTRIÇÃO PADRÃO em tabelas externas.
As definições de coluna, incluindo os tipos de dados e o número de colunas, devem corresponder aos dados nos arquivos externos. Se houver uma incompatibilidade, as linhas do arquivo serão rejeitadas ao consultar os dados reais.
LOCALIZAÇÃO = 'folder_or_filepath'
Especifica a pasta ou o caminho do arquivo e o nome do arquivo para os dados reais no Azure Data Lake ou no Armazenamento de Blobs do Azure. O local começa a partir da pasta raiz. A pasta raiz é o local de dados especificado na fonte de dados externa.
CREATE EXTERNAL TABLE
não cria o caminho e a pasta.
Se você especificar LOCATION como uma pasta, a consulta da Instância Gerenciada SQL do Azure selecionada na tabela externa recuperará arquivos da pasta, mas não de todas as suas subpastas.
A Instância Gerenciada SQL do Azure não pode localizar arquivos em subpastas ou pastas ocultas. Ele também não retorna arquivos para os quais o nome do arquivo começa com um sublinhado (_) ou um ponto (.).
No exemplo de imagem a seguir, se LOCATION='/webdata/'
, uma consulta retornará linhas de mydata.txt
. Ele não retornará mydata2.txt
porque está em uma subpasta, não retornará mydata3.txt
porque está em uma pasta oculta e não retornará _hidden.txt
porque é um arquivo oculto.
DATA_SOURCE = external_data_source_name
Especifica o nome da fonte de dados externa que contém o local dos dados externos. Este local fica no Azure Data Lake. Para criar uma fonte de dados externa, use CREATE EXTERNAL DATA SOURCE.
FILE_FORMAT = external_file_format_name
Especifica o nome do objeto de formato de arquivo externo que armazena o tipo de arquivo e o método de compactação para os dados externos. Para criar um formato de arquivo externo, use CREATE EXTERNAL FILE FORMAT.
Permissões
Requer estas permissões de usuário:
- CRIAR TABELA
- ALTERAR QUALQUER ESQUEMA
- ALTERAR QUALQUER FONTE DE DADOS EXTERNA
- ALTERAR QUALQUER FORMATO DE ARQUIVO EXTERNO
Observação
As permissões CONTROL DATABASE são necessárias para criar apenas a CHAVE MESTRA, A CREDENCIAL COM ESCOPO DO BANCO DE DADOS e a FONTE DE DADOS EXTERNA
Observe que o logon que cria a fonte de dados externa deve ter permissão para ler e gravar na fonte de dados externa, localizada no Hadoop ou no Armazenamento de Blobs do Azure.
Importante
A permissão ALTER ANY EXTERNAL DATA SOURCE concede a qualquer entidade de segurança a capacidade de criar e modificar qualquer objeto de fonte de dados externa e, portanto, também concede a capacidade de acessar todas as credenciais de escopo do banco de dados no banco de dados. Essa permissão deve ser considerada altamente privilegiada e, portanto, deve ser concedida apenas a entidades confiáveis no sistema.
Comentários
Em cenários de consulta ad hoc, como SELECT FROM EXTERNAL TABLE, as linhas recuperadas da fonte de dados externa são armazenadas em uma tabela temporária. Após a conclusão da consulta, as linhas são removidas e a tabela temporária é excluída. Nenhum dado permanente é armazenado em tabelas SQL.
Por outro lado, no cenário de importação, como SELECT INTO FROM EXTERNAL TABLE, as linhas recuperadas da fonte de dados externa são armazenadas como dados permanentes na tabela SQL. A nova tabela é criada durante a execução da consulta quando os dados externos são recuperados.
Atualmente, a virtualização de dados com a Instância Gerenciada SQL do Azure é somente leitura.
Você pode criar muitas tabelas externas que fazem referência à mesma fonte de dados externa ou a fontes de dados externas diferentes.
Limitações e restrições
Como os dados de uma tabela externa não estão sob o controle de gerenciamento direto da Instância Gerenciada SQL do Azure, eles podem ser alterados ou removidos a qualquer momento por um processo externo. Como resultado, não é garantido que os resultados da consulta em uma tabela externa sejam determinísticos. A mesma consulta pode retornar resultados diferentes cada vez que é executada em uma tabela externa. Da mesma forma, uma consulta pode falhar se os dados externos forem movidos ou removidos.
Você pode criar várias tabelas externas que fazem referência a diferentes fontes de dados externas.
Somente estas instruções DDL (Data Definition Language) são permitidas em tabelas externas:
- CRIAR TABELA E SOLTAR TABELA
- CRIAR ESTATÍSTICAS e DROP STATISTICS
- CRIAR VISTA E DROP VIEW
Construções e operações não suportadas:
- A restrição DEFAULT em colunas de tabela externas
- Operações DML (Data Manipulation Language) de exclusão, inserção e atualização
Limitações de largura da tabela
O limite de largura de linha de 1 MB baseia-se no tamanho máximo de uma única linha válida por definição de tabela. Se a soma do esquema de coluna for maior que 1 MB, as consultas de virtualização de dados falharão.
Limitações do tipo de dados
Os seguintes tipos de dados não podem ser usados em tabelas externas na Instância Gerenciada SQL do Azure:
geography
geometry
hierarchyid
image
text
nText
xml
- Qualquer tipo definido pelo usuário
Bloqueio
Bloqueio compartilhado no objeto SCHEMARESOLUTION.
Exemplos
Um. Consultar dados externos da Instância Gerenciada SQL do Azure com uma tabela externa
Para obter mais exemplos, consulte Criar de fonte de dados externa ou consulte Virtualização de dados com a Instância Gerenciada SQL do Azure.
Crie a chave mestra do banco de dados, se ela não existir.
-- Optional: Create MASTER KEY if it doesn't exist in the database: CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong Password>' GO
Crie a credencial com escopo do banco de dados usando um token SAS. Você também pode usar uma identidade gerenciada.
CREATE DATABASE SCOPED CREDENTIAL MyCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<KEY>' ; --Removing leading '?' GO
Crie a fonte de dados externa usando a credencial.
--Create external data source pointing to the file path, and referencing database-scoped credential: CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource WITH ( LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest' CREDENTIAL = [MyCredential] ) GO
Crie um FORMATO DE ARQUIVO EXTERNO e uma TABELA EXTERNA, para consultar os dados como se fosse uma tabela local.
-- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE --Create external file format CREATE EXTERNAL FILE FORMAT DemoFileFormat WITH ( FORMAT_TYPE=PARQUET ) GO --Create external table: CREATE EXTERNAL TABLE tbl_TaxiRides( vendorID VARCHAR(100) COLLATE Latin1_General_BIN2, tpepPickupDateTime DATETIME2, tpepDropoffDateTime DATETIME2, passengerCount INT, tripDistance FLOAT, puLocationId VARCHAR(8000), doLocationId VARCHAR(8000), startLon FLOAT, startLat FLOAT, endLon FLOAT, endLat FLOAT, rateCodeId SMALLINT, storeAndFwdFlag VARCHAR(8000), paymentType VARCHAR(8000), fareAmount FLOAT, extra FLOAT, mtaTax FLOAT, improvementSurcharge VARCHAR(8000), tipAmount FLOAT, tollsAmount FLOAT, totalAmount FLOAT ) WITH ( LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet', DATA_SOURCE = NYCTaxiExternalDataSource, FILE_FORMAT = MyFileFormat ); GO --Then, query the data via an external table with T-SQL: SELECT TOP 10 * FROM tbl_TaxiRides; GO
Próximos passos
Saiba mais sobre tabelas externas e conceitos relacionados nos seguintes artigos: