Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:✅Armazém de dados no Microsoft Fabric
Este artigo descreve como solucionar problemas de falhas de ingestão em padrões de ingestão T-SQL.
A ingestão em um armazém usando as funções COPY INTO, BULK INSERT, OPENROWSET em declarações CTAS, INSERT, UPDATE e MERGE pode falhar por vários motivos. Os valores do arquivo de origem podem não corresponder ao esquema da tabela. Os valores necessários podem estar ausentes. As opções de ingestão também podem estar configuradas incorretamente.
Este guia de solução de problemas usa as informações de diagnóstico de linha rejeitada para resolver falhas, capturar erros de nível de linha e inspecionar linhas rejeitadas com metadados de erro.
Ao examinar os arquivos de erro gerados por COPY INTO e outros comandos de ingestão, você pode identificar exatamente quais linhas falharam na ingestão e por quê. Essas informações ajudam você a identificar problemas de qualidade de dados ou ajustar as configurações de ingestão, corrigir os dados de origem e executar novamente a carga com confiança.
Importante
Essas instruções se aplicam somente à ingestão de arquivos CSV ou JSONL usando comandos Transact-SQL (COPY INTOBULK INSERTe DML com OPENROWSET função). Os arquivos de saída de linhas rejeitadas não são gerados para ferramentas de ingestão externas (como pipelines), arquivos Parquet ou ao ingerir dados do endpoint de análise do SQL.
Criar a tabela de destino
Antes de executar comandos de ingestão, crie uma tabela de destino com tipos e NOT NULL restrições estritos para capturar problemas de conversão e qualidade de dados antecipadamente.
No seu espaço de trabalho do Warehouse, abra seu armazém.
Na guia Página Inicial , selecione Nova consulta SQL.
Execute a seguinte instrução:
DROP TABLE IF EXISTS dbo.TaxiTrips; GO CREATE TABLE dbo.TaxiTrips ( vendorID int NOT NULL, startLat float NOT NULL, startLon float NOT NULL, endLat float NOT NULL, endLon float NOT NULL, passengerCount int NOT NULL, tripDistance float NOT NULL, fareAmount float NOT NULL, mtaTax float NOT NULL, totalAmount float NOT NULL );
Você pode usar vários métodos com suporte, incluindo ingestão com COPY INTO ou ingestão com Transact-SQL. Escolha o método de ingestão que melhor se ajusta aos requisitos de fonte de dados, formato e automação. O exemplo COPY INTO a seguir ilustra um padrão de ingestão comum para carregar dados de arquivos externos em uma tabela.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH ( FILE_TYPE = 'CSV' );
Essa instrução poderá falhar ao ingerir dados se os arquivos de origem não corresponderem ao esquema da tabela de destino. As causas comuns incluem contagens de colunas incompatíveis, tipos de dados incompatíveis ou valores que não podem ser armazenados na tabela de destino. Se a ingestão encontrar valores que não podem ser convertidos no esquema de destino, a instrução retornará um erro semelhante ao seguinte:
Msg 13812, Level 16, State 1, Line 2
Bulk load data conversion error (type mismatch or invalid character for the specified codepage)
for row starting at byte offset 0, column 1 (vendorID).
Underlying data description:
file 'https://....blob.core.windows.net/Files/yellow/tripdata.csv'.
Esse erro indica que uma ou mais linhas não podem ser convertidas nos tipos de coluna de destino.
Investigar erros com MAXERRORS e ERRORFILE
Use as opções a seguir para continuar a ingestão quando o número de erros de nível de linha estiver abaixo de um limite definido e armazenar detalhes de diagnóstico em um local especificado.
-
MAXERRORSdefine o número máximo de falhas de nível de linha toleradas durante a ingestão. -
ERRORFILEespecifica onde o banco de dados grava linhas rejeitadas e detalhes de erro.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH (
FILE_TYPE = 'CSV',
MAXERRORS = 10,
ERRORFILE = 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
);
Importante
Configure ERRORFILE no mesmo local de armazenamento usado para leituras de arquivo de origem, não em uma conta de armazenamento diferente. A identidade usada para acessar dados de origem também deve ter permissões para criar pastas e arquivos no caminho de erro configurado.
A operação de carga só é bem-sucedida quando o número de linhas rejeitadas é menor que MAXERRORS. Quando os erros são capturados, a operação de ingestão grava:
-
error.jsonlpara diagnóstico estruturado -
row.csvpara linhas de origem rejeitadas
Localizar e consultar linhas rejeitadas
O banco de dados grava informações de erro em uma hierarquia de pasta estruturada no local de erro configurado. Essas pastas ajudam você a rastrear uma execução específica e correlacionar o diagnóstico a uma instrução de ingestão:
ERRORFILE/
+-- _rejectedrows/
+-- <timestamp>/
+-- <statement_id>/
+-- error.jsonl
+-- row.csv or rows.jsonl
Use OPENROWSET para ler o diagnóstico error.jsonl estruturado para que você possa identificar qual valor falhou, qual coluna de destino foi afetada e onde a linha com falha se originou:
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/error.jsonl'
);
O conjunto de resultados normalmente inclui uma linha por registro rejeitado, por exemplo:
| Erro | Coluna | NomeDaColuna | Valor | IsOutputted | Arquivo | LocalizaçãoDaLinhaDeErro |
|---|---|---|---|---|---|---|
| Erro de conversão de dados | 1 | vendorID |
vendorID |
1 | https://.../yellow/tripdata.csv |
0 |
| NULL na coluna não anulável | 1 | vendorID |
NULO | 1 | https://.../yellow/ytripdata.csv |
399 |
| Erro de conversão de dados | 6 | passengerCount |
N/A | 1 | https://.../yellow/yellow_tripdata.csv |
519 |
O error.jsonl arquivo contém um objeto JSON por linha. Cada objeto inclui as propriedades listadas na tabela anterior. A tabela a seguir descreve cada propriedade em detalhes.
| Coluna | Descrição |
|---|---|
Error |
Fornece a mensagem de erro que explica por que o valor foi rejeitado durante a ingestão. |
Column |
Especifica o índice da coluna no arquivo CSV de origem que contém o valor que não pôde ser ingerido. A indexação de coluna começa na coluna 1, a primeira. |
ColumnName |
Especifica o nome da coluna da tabela de destino na qual o valor não pôde ser armazenado. |
Value |
Valor de origem que não pôde ser convertido ou validado. |
IsOutputted |
Indica se a linha do arquivo de origem que contém o erro relatado também é gravada no arquivo de saída de linhas rejeitadas (row.csv ou row.jsonl). Um valor (1 ou true em arquivos JSONL) significa que a linha é gravada em error.csv e um valor (0 ou false) significa que não é gravada. |
File |
Identifica o arquivo de origem do qual a linha rejeitada se originou. Esse valor ajuda você a rastrear os dados rejeitados de volta para o arquivo de entrada original para investigação. |
ErrorRowLocation |
Posição de deslocamento de bytes no arquivo de origem em que ocorreu a falha. |
Examinar linhas rejeitadas
Depois de examinar as informações de diagnóstico estruturadas, você pode inspecionar os dados de origem originais que o banco de dados não pôde ingerir. A saída de linhas rejeitadas contém cópias dos registros de origem, preservadas exatamente como aparecem nos arquivos de entrada. O diagnóstico de linhas rejeitadas gera arquivos que contêm apenas os registros que falharam na ingestão:
- Se você ingerir arquivos CSV usando
COPY INTO (FILE_TYPE = 'CSV'), a saída rejeitada incluirá umrow.csvarquivo. Esse arquivo corresponde à estrutura do arquivo de origem e contém as linhas CSV originais com valores inválidos. - Se você ingerir arquivos JSONL usando
OPENROWSET(FORMAT = 'JSONL'), a saída rejeitada incluirá umrow.jsonlarquivo. Esse arquivo preserva os objetos JSON originais que causaram falhas de ingestão.
Use esses arquivos para validar a causa raiz dos erros, como valores malformados, valores inesperados NULL ou linhas de cabeçalho que foram analisadas incorretamente como dados.
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
O row.csv esquema corresponde à forma CSV de origem e contém apenas linhas que falharam na ingestão.
Exemplo de saída de linha rejeitada:
C1 |
C2 |
C3 |
C4 |
C5 |
C6 |
C7 |
C8 |
C9 |
C10 |
|---|---|---|---|---|---|---|---|---|---|
vendorID |
startLat |
startLon |
endLat |
endLon |
passengerCount |
tripDistance |
fareAmount |
mtaTax |
totalAmount |
| NULO | 40.7484 | -73.9857 | 40.7549 | -73.9840 | 2 | 1.40 | 9.00 | 0,50 | 13.20 |
| 1 | 40.7216 | -74.0047 | 40.7359 | -74.0036 | N/A | 1.80 | 11.00 | 0,50 | 15.90 |
Com base nessas informações de diagnóstico, você pode identificar os seguintes problemas de ingestão:
- A linha de cabeçalho no arquivo de origem é analisada erroneamente como uma linha de dados. Para resolver, a instrução
COPY INTOdeve usar a opçãoFIRSTROW = 2. - Uma linha no arquivo de origem da
vendorIDcoluna (C1) contémNULLvalores, mas a coluna correspondente na tabela de destinoTaxiTripsé definida comoNOT NULL. - Uma linha no arquivo de origem da
passengerCountcoluna contém um valor inválido (N/A) que não pode ser convertido na coluna int de destino.
Note
O mesmo processo se aplica quando você examina linhas rejeitadas da entrada JSONL. Use o row.jsonl arquivo para inspecionar os registros rejeitados.
Corrigir problemas de ingestão e reingestão de dados
Depois de identificar a causa das falhas de ingestão, corrija o problema e reingira os dados afetados. A abordagem de correção depende de onde o erro se origina.
Corrigir o esquema da tabela de destino
Se os dados de origem não estiverem em conformidade com o esquema da tabela de destino, atualize a definição da tabela. Correções comuns incluem alterar tipos de dados de coluna ou remover restrições restritivas, como NOT NULL.
Em alguns cenários, talvez seja necessário remover e recriar a tabela de destino antes de ingerir novamente os dados.
Corrigir dados de origem e reprocessar arquivos
Se a ingestão falhar devido a valores inválidos ou inconsistentes nos arquivos de origem, corrija esses valores e reingira os dados. Por exemplo, substitua valores de espaço reservado, como N/A, por valores vazios ou padrões válidos.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/tripdata_corrected.csv'
WITH ( FILE_TYPE = 'CSV' );
Ao ingerir novamente os dados corrigidos, use um caminho de arquivo explícito que aponte para o novo arquivo que contém apenas dados corrigidos, em vez de um caminho de pasta que faça referência aos arquivos originais. Essa abordagem impede a ingestão nova de linhas que foram carregadas com êxito e evita dados duplicados.
Reprocessar linhas rejeitadas usando uma tabela intermediária
Você pode carregar linhas rejeitadas em uma tabela de estágio, corrigir os dados usando instruções de modificação de dados Transact-SQL e, em seguida, reimportar as linhas corrigidas.
A instrução a seguir CREATE TABLE AS SELECT carrega linhas rejeitadas em uma tabela para processamento adicional:
CREATE TABLE TaxiTrip_RejectedRows AS
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
Depois de corrigir os dados, insira as linhas limpas na tabela de destino.