Como usar a OPENROWSET usando o pool de SQL sem servidor no Azure Synapse Analytics
A função OPENROWSET(BULK...)
permite que você acesse arquivos no Armazenamento do Azure. A função OPENROWSET
lê o conteúdo de uma fonte de dados remota (por exemplo, o arquivo) e retorna o conteúdo como um conjunto de linhas. No recurso do pool de SQL sem servidor, o provedor de conjuntos de linhas em massa da OPENROWSET é acessado por meio de uma chamada à função OPENROWSET e da especificação da opção BULK.
A função OPENROWSET
pode ser referenciada na cláusula FROM
de uma consulta como se fosse um nome de tabela OPENROWSET
. Ela também dá suporte a operações em massa por meio de um provedor BULK interno que permite que os dados de um arquivo sejam lidos e retornados como um conjunto de linhas.
Observação
Não há suporte para a função OPENROWSET no pool de SQL dedicado.
Fonte de dados
A função OPENROWSET no SQL do Synapse lê o conteúdo dos arquivos de uma fonte de dados. A fonte de dados é uma conta de armazenamento do Azure e pode ser explicitamente referenciada na função OPENROWSET
ou dinamicamente inferida com base na URL dos arquivos que você deseja ler.
A função OPENROWSET
pode opcionalmente conter um parâmetro DATA_SOURCE
para especificar a fonte de dados que contém arquivos.
OPENROWSET
semDATA_SOURCE
pode ser usado para ler diretamente o conteúdo dos arquivos do local da URL especificado como opçãoBULK
:SELECT * FROM OPENROWSET(BULK 'http://<storage account>.dfs.core.windows.net/container/folder/*.parquet', FORMAT = 'PARQUET') AS [file]
Essa é uma maneira rápida e fácil de ler o conteúdo dos arquivos sem pré-configuração. Essa opção permite que você use a opção de autenticação básica para acessar o armazenamento (passagem do Microsoft Entra para logons do Microsoft Entra e token SAS para logons do SQL).
OPENROWSET
comDATA_SOURCE
pode ser usado para acessar arquivos na conta de armazenamento especificada:SELECT * FROM OPENROWSET(BULK '/folder/*.parquet', DATA_SOURCE='storage', --> Root URL is in LOCATION of DATA SOURCE FORMAT = 'PARQUET') AS [file]
essa opção permite que você configure o local da conta de armazenamento na fonte de dados e especifique o método de autenticação que deve ser usado para acessar o armazenamento.
Importante
OPENROWSET
semDATA_SOURCE
oferece uma forma rápida e fácil de acessar os arquivos de armazenamento, mas oferece opções de autenticação limitadas. Por exemplo, as entidades de segurança do Microsoft Entra podem acessar arquivos apenas usando sua identidade do Microsoft Entra ou arquivos disponíveis publicamente. Se você precisar de opções de autenticação mais avançadas, use a opçãoDATA_SOURCE
e defina a credencial que deseja usar para acessar o armazenamento.
Segurança
Um usuário de banco de dados deve ter a permissão ADMINISTER BULK OPERATIONS
para usar a função OPENROWSET
.
O administrador de armazenamento também deve permitir que um usuário acesse os arquivos fornecendo um token SAS válido ou permitindo que a entidade de segurança do Microsoft Entra acesse os arquivos de armazenamento. Saiba mais sobre o controle de acesso de armazenamento neste artigo.
OPENROWSET
usa as regras a seguir para determinar como se autenticar no armazenamento:
- No
OPENROWSET
semDATA_SOURCE
, o mecanismo de autenticação depende do tipo de chamador.- Qualquer usuário pode usar
OPENROWSET
semDATA_SOURCE
para ler arquivos publicamente disponíveis no Armazenamento do Azure. - Os logons do Microsoft Entra podem acessar arquivos protegidos usando sua própria identidade do Microsoft Entra se o armazenamento do Azure permitir que o usuário do Microsoft Entra acesse arquivos subjacentes (por exemplo, se o chamador tiver permissão de
Storage Reader
no armazenamento do Azure). - Os logons do SQL também podem usar
OPENROWSET
semDATA_SOURCE
para acessar arquivos publicamente disponíveis, arquivos protegidos usando o token SAS ou a Identidade Gerenciada do workspace do Synapse. Você precisaria criar uma credencial com escopo de servidor para permitir o acesso a arquivos de armazenamento.
- Qualquer usuário pode usar
- Em
OPENROWSET
comDATA_SOURCE
, o mecanismo de autenticação é definido na credencial no escopo do banco de dados atribuída à fonte de dados referenciada. Essa opção permite acessar o armazenamento disponível publicamente ou acessar o armazenamento usando o token SAS, a identidade gerenciada do workspace ou a identidade do chamador do Microsoft Entra (se o chamador for a entidade de segurança do Microsoft Entra). SeDATA_SOURCE
referenciar ao armazenamento do Azure que não é público, você precisará criar uma credencial com escopo de banco de dados e referenciá-la noDATA SOURCE
para permitir o acesso aos arquivos de armazenamento.
O chamador deve ter a permissão REFERENCES
na credencial para usá-la para autenticar-se no armazenamento.
Sintaxe
--OPENROWSET syntax for reading Parquet or Delta Lake files
OPENROWSET
( { BULK 'unstructured_data_path' , [DATA_SOURCE = <data source name>, ]
FORMAT= ['PARQUET' | 'DELTA'] }
)
[WITH ( {'column_name' 'column_type' }) ]
[AS] table_alias(column_alias,...n)
--OPENROWSET syntax for reading delimited text files
OPENROWSET
( { BULK 'unstructured_data_path' , [DATA_SOURCE = <data source name>, ]
FORMAT = 'CSV'
[ <bulk_options> ]
[ , <reject_options> ] }
)
WITH ( {'column_name' 'column_type' [ 'column_ordinal' | 'json_path'] })
[AS] table_alias(column_alias,...n)
<bulk_options> ::=
[ , FIELDTERMINATOR = 'char' ]
[ , ROWTERMINATOR = 'char' ]
[ , ESCAPECHAR = 'char' ]
[ , FIRSTROW = 'first_row' ]
[ , FIELDQUOTE = 'quote_characters' ]
[ , DATA_COMPRESSION = 'data_compression_method' ]
[ , PARSER_VERSION = 'parser_version' ]
[ , HEADER_ROW = { TRUE | FALSE } ]
[ , DATAFILETYPE = { 'char' | 'widechar' } ]
[ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ , ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}' ]
<reject_options> ::=
{
| MAXERRORS = reject_value,
| ERRORFILE_DATA_SOURCE = <data source name>,
| ERRORFILE_LOCATION = '/REJECT_Directory'
}
Argumentos
Você tem três opções para arquivos de entrada que contêm os dados de destino para consultar. Os valores válidos são:
'CSV': inclui qualquer arquivo de texto delimitado com separadores de linha/coluna. É possível usar qualquer caractere como um separador de campo, como TSV: FIELDTERMINATOR = guia.
'PARQUET' - Arquivo binário no formato Parquet.
'DELTA' - Um conjunto de arquivos Parquet organizados no formato Delta Lake (versão prévia).
Valores com espaços em branco não são válidos. Por exemplo, 'CSV ' não é um valor válido.
'unstructured_data_path'
O unstructured_data_path que estabelece um caminho para os dados pode ser um caminho absoluto ou relativo:
- O caminho absoluto no formato
\<prefix>://\<storage_account_path>/\<storage_path>
permite que um usuário leia os arquivos diretamente. - Caminho relativo no formato
<storage_path>
que deve ser usado com o parâmetroDATA_SOURCE
e descreve o padrão de arquivo dentro do local <storage_account_path> definido emEXTERNAL DATA SOURCE
.
Abaixo, você encontrará os valores de <caminho de conta de armazenamento> relevantes que serão vinculados à fonte de dados externa específica.
Fonte de dados externa | Prefixo | Caminho da conta de armazenamento |
---|---|---|
Armazenamento do Blobs do Azure | http[s] | <storage_account>.blob.core.windows.net/path/file |
Armazenamento do Blobs do Azure | wasb[s] | <container>@<storage_account>.blob.core.windows.net/path/file |
Azure Data Lake Storage Gen1 | http[s] | <storage_account>.azuredatalakestore.net/webhdfs/v1 |
Azure Data Lake Storage Gen2 | http[s] | <storage_account>.dfs.core.windows.net/caminho/arquivo |
Azure Data Lake Storage Gen2 | abfs[s] | <file_system>@<account_name>.dfs.core.windows.net/path/file |
'<storage_path>'
Especifica um caminho no armazenamento que aponta para a pasta ou o arquivo que você deseja ler. Se o caminho apontar para um contêiner ou uma pasta, todos os arquivos serão lidos nessa pasta ou nesse contêiner específico. Os arquivos nas subpastas não serão incluídos.
Use curingas para direcionar vários arquivos ou várias pastas. O uso de vários curingas não consecutivos é permitido.
Veja abaixo um exemplo que lê todos os arquivos csv que começam com population de todas as pastas que começam com /csv/population:
https://sqlondemandstorage.blob.core.windows.net/csv/population*/population*.csv
Se você especificar o unstructured_data_path para ser uma pasta, uma consulta do pool de SQL sem servidor vai recuperar os arquivos dessa pasta.
Você pode instruir o pool de SQL sem servidor a percorrer as pastas especificando /* ao final do caminho, como no exemplo: https://sqlondemandstorage.blob.core.windows.net/csv/population/**
Observação
Ao contrário do Hadoop e do PolyBase, o pool de SQL sem servidor não retorna subpastas, a menos que você especifique /** ao final do caminho. Assim como o Hadoop e o PolyBase, ele não retorna arquivos cujo nome começa com um sublinhado (_) ou um ponto-final (.).
No exemplo abaixo, se unstructured_data_path=https://mystorageaccount.dfs.core.windows.net/webdata/
, uma consulta do pool de 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.
[WITH ( {'column_name' 'column_type' [ 'column_ordinal'] }) ]
A cláusula WITH permite que você especifique as colunas que deseja ler dos arquivos.
Em arquivos de dados CSV, para ler todas as colunas, forneça nomes de colunas e os respectivos tipos de dados. Se você quiser um subconjunto de colunas, use números ordinais para escolher as colunas dos arquivos de dados de origem por ordinal. As colunas serão vinculadas à designação ordinal. Se HEADER_ROW = TRUE for usado, então a associação de coluna será feita pelo nome da coluna em vez da posição ordinal.
Dica
Também é possível omitir a cláusula WITH para arquivos CSV. Os tipos de dados serão inferidos automaticamente do conteúdo do arquivo. Você pode usar o argumento HEADER_ROW para especificar a existência da linha de cabeçalho e, nesse caso, os nomes das colunas serão lidos dessa linha. Para obter detalhes, confira a descoberta automática de esquema.
Em arquivos Parquet ou Delta Lake, forneça nomes de colunas que correspondam aos nomes de colunas nos arquivos de dados de origem. As colunas serão vinculadas ao nome e diferenciarão maiúsculas de minúsculas. Se a cláusula WITH for omitida, todas as colunas de arquivos Parquet serão retornadas.
Importante
Os nomes de coluna nos arquivos Parquet e Delta Lake diferenciam maiúsculas de minúsculas. Se você especificar o nome da coluna com as configurações de maiúsculas e minúsculas diferentes do nome da coluna nos arquivos, valores
NULL
serão retornados para essa coluna.
column_name = nome da coluna de saída. Se fornecido, esse nome substituirá o nome da coluna no arquivo de origem e o nome da coluna fornecidos no caminho JSON, se houver. Se o json_path não for fornecido, ele será adicionado automaticamente como '$.column_name'. Verifique o argumento json_path para ver o comportamento.
column_type = tipo de dados da coluna de saída. A conversão de tipo de dados implícita ocorrerá aqui.
column_ordinal = número ordinal da coluna nos arquivos de origem. Esse argumento é ignorado em arquivos Parquet, pois a associação é feita por nome. O seguinte exemplo retornará uma segunda coluna somente de um arquivo CSV:
WITH (
--[country_code] VARCHAR (5) COLLATE Latin1_General_BIN2,
[country_name] VARCHAR (100) COLLATE Latin1_General_BIN2 2
--[year] smallint,
--[population] bigint
)
json_path = expressão do caminho JSON para a coluna ou propriedade aninhada. O modo de caminho padrão é incerto.
Observação
Em modo estrito, a consulta falhará com erro se o caminho fornecido não existir. No modo incerto, a consulta será bem-sucedida e a expressão de caminho JSON for avaliada como NULL.
<bulk_options>
FIELDTERMINATOR ='field_terminator'
Especifica o terminador de campo a ser usado. O terminador de campo padrão é uma vírgula (" , ").
ROWTERMINATOR ='row_terminator'`
Especifica o terminador de linha a ser usado. Se o terminador de linha não for especificado, um dos terminadores padrão será usado. Os terminadores padrão para PARSER_VERSION = '1.0' são \r\n, \n e \r. Os terminadores padrão para PARSER_VERSION = '2.0' são \r\n e \n.
Observação
Quando você usa PARSER_VERSION='1.0' e especifica \n (nova linha) como terminador de linha, ele será automaticamente prefixado com um caractere \r (retorno de carro), o que resulta em um terminador de linha \r\n.
ESCAPE_CHAR = 'char'
Especifica o caractere no arquivo que é usado para fazer escape dele mesmo e de todos os valores delimitadores no arquivo. Se o caractere de escape for seguido por um valor diferente dele mesmo ou por um dos valores delimitadores, o caractere de escape será removido durante a leitura do valor.
O parâmetro ESCAPECHAR será aplicado independentemente de FIELDQUOTE estar ou não habilitado. Ele não será usado para fazer escape do caractere de aspas. O caractere de aspas deve ter escape com outro caractere de aspas. O caractere de aspas poderá aparecer no valor da coluna somente se o valor for encapsulado com caracteres de aspas.
FIRSTROW = 'first_row'
Especifica o número da primeira linha a carregar. O padrão é 1 e indica a primeira fila no arquivo de dados especificado. Os números de linhas são determinados pela contagem dos terminadores de linha. FIRSTROW tem base 1.
FIELDQUOTE = 'field_quote'
Especifica um caractere que será usado como o caractere de aspas no arquivo CSV. Se não for especificado, o caractere de aspas (") será usado.
DATA_COMPRESSION = 'data_compression_method'
Especifica o método de compactação. Com suporte somente em PARSER_VERSION='1.0'. Há suporte para o seguinte método de compactação:
- GZIP
PARSER_VERSION = 'parser_version'
Especifica a versão do analisador a ser usada ao ler arquivos. As versões do analisador CSV com suporte no momento são 1.0 e 2.0:
- PARSER_VERSION = '1.0'
- PARSER_VERSION = '2.0'
O analisador CSV versão 1.0 é o padrão e conta com muitos recursos. A versão 2.0 foi construída para desempenho e não dá suporte para todas as opções e codificações.
Especificações do analisador CSV versão 1.0:
- As opções a seguir não têm suporte: HEADER_ROW.
- Os terminadores padrão são \r\n, \n e \r.
- Se você especificar \n (nova linha) como terminador de linha, ele será automaticamente prefixado com um caractere \r (retorno de carro), o que resulta em um terminador de linha \r\n.
Especificações do analisador CSV versão 2.0:
- não há suporte para todos os tipos de dados.
- O tamanho máximo da coluna de caracteres é 8.000.
- O limite de tamanho máximo de linha é de 8 MB.
- As opções a seguir não têm suporte: DATA_COMPRESSION.
- A cadeia de caracteres vazia entre aspas ("") é interpretada como cadeia de caracteres vazia.
- A opção DATEFORMAT SET não é respeitada.
- Formato com suporte para o tipo de dados DATE: AAAA-MM-DD
- Formato com suporte para o tipo de dados TIME: HH:MM:SS[.segundos fracionários]
- Formato com suporte para o tipo de dados DATETIME2: AAAA-MM-DD HH:MM:SS[.segundos fracionários]
- Os terminadores padrão são \r\n e \n.
HEADER_ROW = { TRUE | FALSE }
Especifica se um arquivo CSV contém a linha de cabeçalho. O padrão é FALSE.
Com suporte em PARSER_VERSION='2.0'. Se for TRUE, os nomes de coluna serão lidos da primeira linha, de acordo com o argumento FIRSTROW. Se TRUE e esquema forem especificados usando WITH, a associação de nomes de colunas será feita por nome da coluna, não posições ordinais.
DATAFILETYPE = { 'char' | 'widechar' }
Especifica a codificação: char
é usado para arquivos UTF8 e widechar
é usado para arquivos UTF16.
CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' }
Especifica a página de código dos dados no arquivo de dados. O valor padrão é 65001 (codificação UTF-8). Confira mais detalhes sobre essa opção aqui.
ROWSET_OPTIONS = '{"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}'
Essa opção desabilitará a verificação de modificação de arquivo durante a execução da consulta e lerá os arquivos que são atualizados enquanto a consulta está em execução. Essa é uma opção útil quando você precisa ler arquivos somente de acréscimo que são anexados enquanto a consulta está em execução. Nos arquivos anexáveis, o conteúdo existente não é atualizado e apenas novas linhas são adicionadas. Portanto, a probabilidade de resultados errados é minimizada em comparação com os arquivos atualizáveis. Essa opção pode permitir que você leia os arquivos acrescentados com frequência sem precisar lidar com os erros. Veja mais informações na seção Como consultar arquivos CSV acrescentáveis.
Opções de rejeição
Observação
O recurso de linhas rejeitadas está em Visualização Pública. Observe que o recurso de linhas rejeitadas funciona para arquivos de texto delimitados e PARSER_VERSION 1.0.
Especifique parâmetros de rejeição que determinam como o serviço manipulará registros sujos recuperados da fonte de dados externa. Um registro de dados é considerado “sujo” se os tipos de dados reais não correspondem às definições de coluna da tabela externa.
Quando você não especifica nem altera os valores de rejeição, o serviço usa valores padrão. O serviço usará as opções de rejeição para determinar o número de linhas que podem ser rejeitadas antes que a consulta real falhe. A consulta retorna resultados (parciais) até que o limite de rejeição seja excedido. Em seguida, ela falha com a mensagem de erro apropriada.
MAXERRORS = reject_value
Especifica o número ou o percentual de linhas que podem ser rejeitadas antes da consulta falhar. MAXERRORS deve ser um inteiro entre 0 e 2.147.483.647.
ERRORFILE_DATA_SOURCE = data source
Especifica a fonte de dados em que as linhas rejeitadas e o arquivo de erro correspondente devem ser gravados.
ERRORFILE_LOCATION = Directory Location
Especifica o diretório no DATA_SOURCE, ou ERROR_FILE_DATASOURCE, se especificado, em que as linhas rejeitadas e o arquivo de erro correspondente devem ser gravados. Se o caminho especificado não existir, o serviço criará um em seu nome. Um diretório filho é criado com o nome "rejectedrows". O caractere " " garante que o diretório tenha escape para outro processamento de dados, a menos que explicitamente nomeado no parâmetro de localização. Dentro desse diretório, há uma pasta criada com base na hora do envio do carregamento no formato YearMonthDay_HourMinuteSecond_StatementID (por exemplo, 20180330-173205-559EE7D2-196D-400A-806D-3BF5D007F891). Você pode usar a ID da instrução para correlacionar a pasta com a consulta que a gerou. Nesta pasta, dois arquivos são gravados: o arquivo error.json e o arquivo de dados.
O arquivo error.json contém a matriz json com os erros encontrados relacionados a linhas rejeitadas. Cada elemento que representa o erro contém os seguintes atributos:
Atributo | Descrição |
---|---|
Erro | Motivo pelo qual a linha é rejeitada. |
Linha | Número ordinal de linha rejeitado no arquivo. |
Coluna | Número ordinal de coluna rejeitada. |
Valor | Valor de coluna rejeitado. Se o valor for maior que 100 caracteres, somente os primeiros 100 caracteres serão exibidos. |
Arquivo | Caminho para o arquivo ao qual a linha pertence. |
Análise rápida de texto delimitado
Há duas versões do analisador de texto delimitado que você pode usar. O analisador CSV versão 1.0 é padrão e repleto de recursos, enquanto o analisador versão 2.0 foi criado para desempenho. A melhoria de desempenho do analisador 2.0 vem de técnicas de análise avançadas e do multithreading. A diferença de velocidade será maior conforme aumentar o tamanho do arquivo.
Descoberta automática de esquema
Você pode consultar com facilidade arquivos CSV e Parquet sem conhecer ou especificar o esquema omitindo a cláusula WITH. Os nomes de coluna e os tipos de dados serão inferidos dos arquivos.
Os arquivos Parquet contêm metadados de coluna que serão lidos, mapeamentos de tipo podem ser encontrados nos mapeamentos de tipo do Parquet. Confira como ler os arquivos Parquet sem especificar o esquema para obter exemplos.
Para arquivos CSV, os nomes das colunas podem ser lidos na linha de cabeçalho. Você pode especificar se a linha de cabeçalho existe usando o argumento HEADER_ROW. Se HEADER_ROW=FALSE, serão usados nomes de coluna genéricos: C1, C2, ... Cn, em que n corresponde ao número total de colunas contidas no arquivo. Os tipos de dados serão inferidos das primeiras 100 linhas de dados. Confira como ler os arquivos CSV sem especificar o esquema para obter exemplos.
Tenha em mente que, se você estiver lendo o número de arquivos de uma só vez, o esquema será inferido do primeiro arquivo obtido do armazenamento. Isso pode significar que algumas das colunas esperadas são omitidas, tudo porque o arquivo usado pelo serviço para definir o esquema não continha essas colunas. Nesse caso, utilize a cláusula OPENROWSET WITH.
Importante
Há casos em que o tipo de dados apropriado não pode ser inferido devido à falta de informações e um tipo de dados mais abrangente é usado. Isso causa uma sobrecarga de desempenho e é particularmente significativo para colunas de caracteres que serão inferidas como varchar (8000). Para um desempenho ideal, verifique os tipos de dados inferidos e use os tipos de dados apropriados.
Mapeamento de tipos para Parquet
Os arquivos Parquet e Delta Lake contêm descrições de tipo para cada coluna. A tabela a seguir descreve como os tipos Parquet são mapeados para tipos nativos do SQL.
Tipo do Parquet | Tipo lógico do Parquet (anotação) | Tipo de dados SQL |
---|---|---|
BOOLEAN | bit | |
BINARY/BYTE_ARRAY | varbinary | |
DOUBLE | FLOAT | |
FLOAT | real | |
INT32 | int | |
INT64 | BIGINT | |
INT96 | datetime2 | |
FIXED_LEN_BYTE_ARRAY | binary | |
BINARY | UTF8 | varchar *(ordenação UTF8) |
BINARY | STRING | varchar *(ordenação UTF8) |
BINARY | ENUM | varchar *(ordenação UTF8) |
FIXED_LEN_BYTE_ARRAY | UUID | UNIQUEIDENTIFIER |
BINARY | DECIMAL | decimal |
BINARY | JSON | varchar(8000) *(agrupamento UTF8) |
BINARY | BSON | Sem suporte |
FIXED_LEN_BYTE_ARRAY | DECIMAL | decimal |
BYTE_ARRAY | INTERVAL | Sem suporte |
INT32 | INT(8, true) | SMALLINT |
INT32 | INT(16, true) | SMALLINT |
INT32 | INT(32, true) | INT |
INT32 | INT(8, false) | TINYINT |
INT32 | INT(16, false) | INT |
INT32 | INT(32, false) | BIGINT |
INT32 | DATE | date |
INT32 | DECIMAL | decimal |
INT32 | TIME (MILLIS) | time |
INT64 | INT(64, true) | BIGINT |
INT64 | INT(64, false) | decimal(20,0) |
INT64 | DECIMAL | decimal |
INT64 | TIME (MICROS) | time |
INT64 | TIME (NANOS) | Sem suporte |
INT64 | TIMESTAMP (normalizado para UTC) (MILLIS/MICROS) | datetime2 |
INT64 | TIMESTAMP (não normalizado para UTC) (MILLIS/MICROS) | bigint – Lembre-se de ajustar explicitamente o valor bigint com a diferença de fuso horário antes de convertê-lo em um valor de datetime. |
INT64 | TIMESTAMP (NANOS) | Sem suporte |
Tipo complexo | LISTA | varchar(8000), serializado em JSON |
Tipo complexo | MAP | varchar(8000), serializado em JSON |
Exemplos
Ler arquivos CSV sem especificar o esquema
O seguinte exemplo lê o arquivo CSV que contém a linha de cabeçalho sem especificar os nomes das colunas ou os tipos de dados:
SELECT
*
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
FORMAT = 'CSV',
PARSER_VERSION = '2.0',
HEADER_ROW = TRUE) as [r]
O seguinte exemplo lê o arquivo CSV que não contém a linha de cabeçalho sem especificar os nomes das colunas ou os tipos de dados:
SELECT
*
FROM OPENROWSET(
BULK 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.csv',
FORMAT = 'CSV',
PARSER_VERSION = '2.0') as [r]
Ler arquivos Parquet sem especificar o esquema
O seguinte exemplo retorna todas as colunas da primeira linha do conjunto de dados de censo no formato Parquet, sem especificar nomes de colunas nem tipos de dados:
SELECT
TOP 1 *
FROM
OPENROWSET(
BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
FORMAT='PARQUET'
) AS [r]
Ler arquivos Delta Lake sem especificar o esquema
O seguinte exemplo retorna todas as colunas da primeira linha do conjunto de dados de censo no formato Delta Lake, sem especificar nomes de colunas nem tipos de dados:
SELECT
TOP 1 *
FROM
OPENROWSET(
BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
FORMAT='DELTA'
) AS [r]
Ler colunas específicas do arquivo CSV
O exemplo a seguir retorna apenas duas colunas com números ordinais 1 e 4 dos arquivos population*.csv. Como não há nenhuma linha de cabeçalho nos arquivos, ele inicia a leitura na primeira linha:
SELECT
*
FROM OPENROWSET(
BULK 'https://sqlondemandstorage.blob.core.windows.net/csv/population/population*.csv',
FORMAT = 'CSV',
FIRSTROW = 1
)
WITH (
[country_code] VARCHAR (5) COLLATE Latin1_General_BIN2 1,
[population] bigint 4
) AS [r]
Ler colunas específicas do arquivo Parquet
O exemplo seguinte retorna apenas duas colunas da primeira linha do conjunto de dados do censo em formato Parquet:
SELECT
TOP 1 *
FROM
OPENROWSET(
BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
FORMAT='PARQUET'
)
WITH (
[stateName] VARCHAR (50),
[population] bigint
) AS [r]
Especificar colunas usando caminhos JSON
O seguinte exemplo mostra como você pode usar expressões de caminho JSON na cláusula WITH e demonstra a diferença entre os modos de caminho estrito e incerto:
SELECT
TOP 1 *
FROM
OPENROWSET(
BULK 'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=20*/*.parquet',
FORMAT='PARQUET'
)
WITH (
--lax path mode samples
[stateName] VARCHAR (50), -- this one works as column name casing is valid - it targets the same column as the next one
[stateName_explicit_path] VARCHAR (50) '$.stateName', -- this one works as column name casing is valid
[COUNTYNAME] VARCHAR (50), -- STATEname column will contain NULLs only because of wrong casing - it targets the same column as the next one
[countyName_explicit_path] VARCHAR (50) '$.COUNTYNAME', -- STATEname column will contain NULLS only because of wrong casing and default path mode being lax
--strict path mode samples
[population] bigint 'strict $.population' -- this one works as column name casing is valid
--,[population2] bigint 'strict $.POPULATION' -- this one fails because of wrong casing and strict path mode
)
AS [r]
Especificar vários arquivos/pastas no caminho BULK
O exemplo a seguir mostra como você pode usar vários caminhos de arquivo/pasta no parâmetro BULK:
SELECT
TOP 10 *
FROM
OPENROWSET(
BULK (
'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=2000/*.parquet',
'https://azureopendatastorage.blob.core.windows.net/censusdatacontainer/release/us_population_county/year=2010/*.parquet'
),
FORMAT='PARQUET'
)
AS [r]
Próximas etapas
Para obter mais amostras, confira o Início Rápido: Consultar o armazenamento de dados para saber como usar OPENROWSET
para ler formatos de arquivo CSV, PARQUET, DELTA LAKE e JSON. Confira as melhores práticas para alcançar o desempenho ideal. Você também pode aprender a salvar os resultados de sua consulta no Armazenamento do Azure usando CETAS.