Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:✅ Magazyn w systemie Microsoft Fabric
Artykuł opisuje, jak rozwiązywać problemy z błędami integracji danych w wzorcach integracji danych T-SQL.
Pozyskiwanie do magazynu przy użyciu funkcji COPY INTO, BULK INSERT, OPENROWSET w instrukcjach CTAS, INSERT, UPDATE i MERGE może zakończyć się niepowodzeniem z kilku powodów. Wartości pliku źródłowego mogą nie być zgodne ze schematem tabeli. Brak wymaganych wartości. Opcje importowania mogą być również nieprawidłowo skonfigurowane.
Ten przewodnik rozwiązywania problemów używa informacji diagnostycznych odrzuconych wierszy do rozwiązywania błędów, przechwytywania błędów na poziomie wiersza i sprawdzania odrzuconych wierszy z metadanymi błędów.
Poprzez sprawdzenie plików błędów wygenerowanych przez COPY INTO i inne polecenia pozyskiwania, można dokładnie wykazać, które wiersze nie zostały przetworzone i dlaczego. Te informacje ułatwiają identyfikowanie problemów z jakością danych lub dostosowywanie ustawień pozyskiwania, naprawianie danych źródłowych i ponowne uruchamianie obciążenia z ufnością.
Ważna
Instrukcje te dotyczą tylko pozyskiwania plików CSV lub JSONL przy użyciu poleceń Transact-SQL (COPY INTO, BULK INSERT oraz DML z funkcją OPENROWSET). Pliki wyjściowe odrzuconych wierszy nie są generowane dla zewnętrznych narzędzi pozyskiwania (takich jak pipelines), Parquet Files, lub podczas pozyskiwania danych z SQL Analytics Endpoint.
Tworzenie tabeli docelowej
Przed uruchomieniem poleceń pozyskiwania utwórz tabelę docelową z rygorystycznymi typami i NOT NULL ograniczeniami, aby wcześnie przechwytywać problemy z konwersją i jakością danych.
W obszarze roboczym otwórz swój magazyn.
Na karcie Narzędzia główne wybierz pozycję Nowe zapytanie SQL.
Uruchom następującą instrukcję:
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 );
Można użyć wielu obsługiwanych metod, w tym pozyskiwania z funkcją COPY INTO lub pozyskiwania za pomocą języka Transact-SQL. Wybierz metodę pozyskiwania, która najlepiej pasuje do źródła danych, formatu i wymagań automatyzacji. Poniższy przykład COPY INTO ilustruje typowy wzorzec importowania na potrzeby ładowania danych z plików zewnętrznych do tabeli.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH ( FILE_TYPE = 'CSV' );
Ta instrukcja nie może pozyskać danych, jeśli pliki źródłowe nie są zgodne ze schematem tabeli docelowej. Typowe przyczyny to niedopasowane liczby kolumn, niezgodne typy danych lub wartości, których nie można przechowywać w tabeli docelowej. Jeśli pozyskiwanie napotka wartości, których nie można przekonwertować na schemat docelowy, instrukcja zwraca błąd podobny do następującego:
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'.
Ten błąd wskazuje, że nie można przekonwertować co najmniej jednego wiersza na typy kolumn docelowych.
Badanie błędów za pomocą funkcji MAXERRORS i ERRORFILE
Użyj poniższych opcji, aby kontynuować pozyskiwanie, gdy liczba błędów na poziomie wiersza jest poniżej zdefiniowanego progu i do przechowywania szczegółów diagnostycznych w określonej lokalizacji.
-
MAXERRORSUstawia maksymalną liczbę tolerowanych błędów na poziomie wiersza podczas przyjmowania danych. -
ERRORFILEokreśla, gdzie baza danych zapisuje odrzucone wiersze i szczegóły błędu.
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/'
);
Ważna
Skonfiguruj ERRORFILE w ramach tej samej lokalizacji magazynu używanej do odczytu pliku źródłowego, a nie na innym koncie magazynu. Tożsamość używana do uzyskiwania dostępu do danych źródłowych musi mieć również uprawnienia do tworzenia folderów i plików w skonfigurowanej ścieżce błędu.
Operacja ładowania kończy się powodzeniem tylko wtedy, gdy liczba odrzuconych wierszy jest niższa niż MAXERRORS. Gdy błędy są przechwytywane, operacja ładowania danych zapisuje:
-
error.jsonldo diagnostyki ustrukturyzowanej -
row.csvdla odrzuconych wierszy źródłowych
Znajdowanie i odpytywanie odrzuconych wierszy
Baza danych zapisuje informacje o błędach w uporządkowanej hierarchii folderów w skonfigurowanej lokalizacji dla błędów. Te foldery ułatwiają śledzenie konkretnych wykonań i korelowanie diagnostyki z jedną instrukcją dotyczącą pozyskiwania danych.
ERRORFILE/
+-- _rejectedrows/
+-- <timestamp>/
+-- <statement_id>/
+-- error.jsonl
+-- row.csv or rows.jsonl
Użyj OPENROWSET, aby odczytać ustrukturyzowaną diagnostykę w error.jsonl, określając, która wartość nie powiodła się, która kolumna docelowa została dotknięta i skąd pochodzi wiersz z błędem.
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/error.jsonl'
);
Zestaw wyników zazwyczaj zawiera jeden wiersz na odrzucony rekord, na przykład:
| Error | Column | ColumnName | Wartość | IsOutputted | File | ErrorRowLocation |
|---|---|---|---|---|---|---|
| Błąd konwersji danych | 1 | vendorID |
vendorID |
1 | https://.../yellow/tripdata.csv |
0 |
| Wartość NULL w kolumnie bez wartości null | 1 | vendorID |
ZERO | 1 | https://.../yellow/ytripdata.csv |
399 |
| Błąd konwersji danych | 6 | passengerCount |
N/A | 1 | https://.../yellow/yellow_tripdata.csv |
519 |
Plik error.jsonl zawiera jeden obiekt JSON na wiersz. Każdy obiekt zawiera właściwości wymienione w poprzedniej tabeli. W poniższej tabeli opisano szczegółowo każdą właściwość.
| Column | Description |
|---|---|
Error |
Zawiera komunikat o błędzie wyjaśniający, dlaczego wartość została odrzucona podczas przetwarzania. |
Column |
Określa indeks kolumny w źródłowym pliku CSV zawierającym wartość, której nie można pozyskać. Indeksowanie kolumn rozpoczyna się od 1 pierwszej kolumny. |
ColumnName |
Określa nazwę docelowej kolumny tabeli, w której nie można przechowywać wartości. |
Value |
Wartość źródłowa, której nie można przekonwertować ani zweryfikować. |
IsOutputted |
Wskazuje, czy wiersz z pliku źródłowego, który zawiera zgłoszony błąd, jest również zapisywany w pliku wyjściowym odrzuconych wierszy (row.csv lub row.jsonl). Wartość 1 (lub true w plikach JSONL) oznacza, że wiersz jest zapisywany w pliku error.csv, a wartość 0 (lub false w plikach JSONL) oznacza, że nie jest. |
File |
Identyfikuje plik źródłowy, z którego pochodzi odrzucony wiersz. Ta wartość ułatwia śledzenie odrzuconych danych z powrotem do oryginalnego pliku wejściowego w celu zbadania. |
ErrorRowLocation |
Pozycja przesunięcia bajtowego w pliku źródłowym, w którym wystąpił błąd. |
Przegląd odrzuconych wierszy
Po przejrzeniu ustrukturyzowanych informacji diagnostycznych można sprawdzić oryginalne dane źródłowe, których baza danych nie mogła pozyskać. Dane wyjściowe dotyczące odrzuconych wierszy zawierają kopie rekordów źródłowych, zachowane dokładnie w takiej formie, w jakiej występowały w plikach wejściowych. Diagnozowanie odrzuconych wierszy generuje pliki zawierające tylko rekordy, które nie zostały poprawnie pozyskane.
- Jeśli pozyskujesz pliki CSV przy użyciu polecenia
COPY INTO (FILE_TYPE = 'CSV'), odrzucone dane zawierająrow.csv-plik. Ten plik pasuje do struktury pliku źródłowego i zawiera oryginalne wiersze CSV z nieprawidłowymi wartościami. - Jeśli pozyskujesz pliki JSONL przy użyciu
OPENROWSET(FORMAT = 'JSONL'), odrzucone dane wyjściowe zawierają plikrow.jsonl. Ten plik zachowuje oryginalne obiekty JSON, które spowodowały błędy importu.
Użyj tych plików, aby zweryfikować główną przyczynę błędów, takich jak źle sformułowane wartości, nieoczekiwane NULL wartości lub wiersze nagłówka, które zostały niepoprawnie przeanalizowane jako dane.
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
row.csv Schemat pasuje do źródłowego kształtu CSV i zawiera tylko wiersze, które zakończyły się niepowodzeniem pozyskiwania.
Przykładowe dane wyjściowe odrzuconych wierszy:
C1 |
C2 |
C3 |
C4 |
C5 |
C6 |
C7 |
C8 |
C9 |
C10 |
|---|---|---|---|---|---|---|---|---|---|
vendorID |
startLat |
startLon |
endLat |
endLon |
passengerCount |
tripDistance |
fareAmount |
mtaTax |
totalAmount |
| ZERO | 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 |
Na podstawie tych informacji diagnostycznych można zidentyfikować następujące problemy z wprowadzaniem danych:
- Wiersz nagłówka w pliku źródłowym jest błędnie analizowany jako wiersz danych. Aby rozwiązać, instrukcja
COPY INTOpowinna korzystać z opcjiFIRSTROW = 2. - Wiersz dla kolumny
vendorIDw pliku źródłowym (C1) zawieraNULLwartości, ale odpowiednia kolumna w tabeli docelowejTaxiTripsjest zdefiniowana jakoNOT NULL. - Wiersz w pliku źródłowym dotyczącym kolumny
passengerCountzawiera nieprawidłową wartość (N/A), której nie można przekonwertować do docelowej kolumny int.
Note
Ten sam proces ma zastosowanie podczas badania odrzuconych wierszy z danych wejściowych JSONL. Użyj pliku row.jsonl, aby sprawdzić odrzucone rekordy.
Napraw problemy z wczytywaniem i ponownie wczytaj dane
Po zidentyfikowaniu przyczyny niepowodzeń ingestii, usuń problem i ponownie załaduj dane, których dotyczy problem. Podejście korygujące zależy od tego, skąd pochodzi błąd.
Naprawianie schematu tabeli docelowej
Jeśli dane źródłowe nie są zgodne ze schematem tabeli docelowej, zaktualizuj definicję tabeli. Typowe poprawki obejmują zmienianie typów danych kolumn lub usuwanie restrykcyjnych ograniczeń, takich jak NOT NULL.
W niektórych scenariuszach może być konieczne usunięcie i ponowne utworzenie tabeli docelowej przed ponownym pozyskiwaniem danych.
Popraw dane źródłowe i ponownie wczytaj pliki
Jeśli pozyskiwanie nie powiedzie się z powodu nieprawidłowych lub niespójnych wartości w plikach źródłowych, popraw te wartości i ponownie pozyskaj dane. Na przykład zastąp wartości symboli zastępczych, takich jak N/A, pustymi wartościami lub prawidłowymi wartościami domyślnymi.
COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/tripdata_corrected.csv'
WITH ( FILE_TYPE = 'CSV' );
Podczas ponownego pozyskiwania poprawionych danych użyj jawnej ścieżki pliku wskazującej nowy plik zawierający tylko poprawione dane, a nie ścieżkę folderu odwołującą się do oryginalnych plików. Takie podejście zapobiega ponownemu wczytywaniu wierszy, które zostały wcześniej pomyślnie załadowane, i unika duplikowania danych.
Ponowne przetwarzanie odrzuconych wierszy przy użyciu tabeli przejściowej
Można załadować odrzucone wiersze do tabeli przejściowej, naprawić dane przy użyciu instrukcji Transact-SQL modyfikacji danych, a następnie ponownie pozyskać poprawione wiersze.
Poniższa CREATE TABLE AS SELECT instrukcja ładuje odrzucone wiersze do tabeli w celu dalszego przetwarzania:
CREATE TABLE TaxiTrip_RejectedRows AS
SELECT *
FROM OPENROWSET(
BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);
Po skorygowaniu danych wstaw oczyszczone wiersze do tabeli docelowej.