Riešenie Transact-SQL chýb pri prijímaní pomocou chybových súborov

Vzťahuje sa na: ✅ sklad v Microsoft Fabric

Tento článok popisuje, ako riešiť poruchy príjmu v T-SQL vzoroch príjmu.

Vstup do skladu pomocou COPY INTOfunkcií , BULK INSERT, OPENROWSET , CTASINSERTUPDATE, , a príkazov MERGE môže zlyhať z viacerých dôvodov. Hodnoty zdrojových súborov nemusia zodpovedať tabuľkovej schéme. Požadované hodnoty môžu chýbať. Možnosti príjmu môžu byť tiež nesprávne nastavené.

Tento návod na riešenie problémov využíva diagnostické informácie o odmietnutých riadkoch na riešenie zlyhaní, zachytávanie chýb na úrovni riadkov a kontrolu zamietnutých riadkov s chybovými metadátami.

Preskúmaním chybových súborov generovaných COPY INTO a ďalšími príkazmi na príjem môžete presne určiť, ktoré riadky zlyhali a prečo. Tieto informácie vám pomôžu identifikovať problémy s kvalitou dát alebo upraviť nastavenia príjmu, opraviť zdrojové dáta a s istotou znovu spustiť záťaž.

Dôležité

Tieto inštrukcie platia iba pre prijímanie CSV alebo JSONL súborov pomocou príkazov Transact-SQL (COPY INTO, BULK INSERT, a DML s funkciou OPENROWSET ). Odmietnuté riadky a výstupné súbory sa negenerujú pre externé nástroje na prijímanie (ako sú pipeline),súbory Parquet alebo pri prijímaní dát z SQL analytics endpointu.

Vytvorte cieľovú tabuľku

Pred spustením príkazov na príjem vytvorte cieľovú tabuľku s prísnymi typmi a NOT NULL obmedzeniami, aby ste včas odhalili problémy s konverziou a kvalitou dát.

  1. Vo vašom skladovom pracovnom priestore otvorte svoj sklad.

  2. Na karte Domov vyberte Nový SQL dotaz.

    Snímka obrazovky hornej časti pracovného priestoru používateľa zobrazujúca tlačidlo nový dotaz SQL.

  3. Spustite nasledujúce vyhlásenie:

    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
    );
    

Môžete použiť viacero podporovaných metód, vrátane ingestovania cez COPY INTO alebo ingestovania cez Transact-SQL. Vyberte si metódu prijímania, ktorá najlepšie vyhovuje vašim požiadavkám na zdroj dát, formát a automatizáciu. Nasledujúci príklad COPY INTO ilustruje bežný vzor príjmu údajov pri načítavaní dát z externých súborov do tabuľky.

COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/'
WITH ( FILE_TYPE = 'CSV' );

Tento príkaz môže zlyhať pri prijímaní dát, ak zdrojové súbory nezodpovedajú schéme cieľovej tabuľky. Bežné príčiny zahŕňajú nesúlad v počte stĺpcov, nekompatibilné dátové typy alebo hodnoty, ktoré nie je možné uložiť do cieľovej tabuľky. Ak príjem narazí na hodnoty, ktoré nie je možné konvertovať do cieľovej schémy, príkaz vráti chybu podobnú nasledujúcej tejto:

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'.

Táto chyba znamená, že jeden alebo viac riadkov nie je možné previesť na cieľové typy stĺpcov.

Vyšetrovanie chýb pomocou MAXERRORS a ERRORFILE

Použite nasledujúce možnosti na pokračovanie v prijímaní, keď je počet chýb na úrovni riadkov pod definovaným prahom, a na uloženie diagnostických detailov na určené miesto.

  • MAXERRORS stanovuje maximálny počet tolerovaných zlyhaní na úrovni riadku počas prijímania.
  • ERRORFILE špecifikuje, kam databáza zapisuje zamietnuté riadky a detaily chyby.
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/'
);

Dôležité

Konfigurujte ERRORFILE na rovnakom úložisku, ktoré sa používa na čítanie zdrojových súborov, nie v inom úložnom účte. Identita použitá na prístup k zdrojovým dátam musí mať tiež oprávnenia na vytváranie priečinkov a súborov v nastavenej chybovej ceste.

Operácia načítania je úspešná len vtedy, keď počet zamietnutých riadkov je nižší ako MAXERRORS. Keď sa zachytia chyby, operácia príjmu zapíše:

  • error.jsonl pre štruktúrovanú diagnostiku
  • row.csv pre zamietnuté zdrojové riadky

Nájdite a vyhľadajte zamietnuté riadky

Databáza zapisuje chybové informácie do štruktúrovanej hierarchie priečinkov pod nastavenou lokalitou chyby. Tieto priečinky vám pomáhajú vystopovať konkrétne vykonanie a korelovať diagnostiku s jedným príkazom na príjem:

ERRORFILE/
+-- _rejectedrows/
    +-- <timestamp>/
        +-- <statement_id>/
            +-- error.jsonl
            +-- row.csv or rows.jsonl

Použite OPENROWSET na čítanie štruktúrovanej diagnostiky error.jsonl , aby ste mohli identifikovať, ktorá hodnota zlyhala, ktorý cieľový stĺpec bol ovplyvnený a odkiaľ pochádza zlyhajúci riadok:

SELECT *
FROM OPENROWSET(
    BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/error.jsonl'
);

Výsledná sada zvyčajne obsahuje jeden riadok na každý zamietnutý záznam, napríklad:

Chyba Stĺpec NázovStĺpca Value IsOutputted Súbor ErrorRowLocation
Chyba pri konverzii dát 1 vendorID vendorID 1 https://.../yellow/tripdata.csv 0
NULL v nenulovateľnom stĺpci 1 vendorID NULL 1 https://.../yellow/ytripdata.csv 399
Chyba pri konverzii dát 6 passengerCount N/A 1 https://.../yellow/yellow_tripdata.csv 519

Súbor error.jsonl obsahuje jeden JSON objekt na riadok. Každý objekt obsahuje vlastnosti uvedené v predchádzajúcej tabuľke. Nasledujúca tabuľka podrobne popisuje každú vlastnosť.

Stĺpec Popis
Error Poskytuje chybovú správu, ktorá vysvetľuje, prečo bola hodnota odmietnutá počas prijímania.
Column Špecifikuje index stĺpca v zdrojovom CSV súbore, ktorý obsahuje hodnotu, ktorú nebolo možné importovať. Indexovanie stĺpcov začína pre 1 prvý stĺpec.
ColumnName Špecifikuje názov stĺpca cieľovej tabuľky, do ktorého sa hodnota nedala uložiť.
Value Zdrojová hodnota, ktorú nebolo možné konvertovať ani overiť.
IsOutputted Označuje, či riadok zo zdrojového súboru, ktorý obsahuje nahlásenú chybu, je tiež zapísaný do výstupného súboru odmietnutého riadku (row.csv alebo row.jsonl). Hodnota ( 1 alebo true v súboroch JSONL) znamená, že riadok je zapísaný v error.csv, a hodnota ( 0 alebo false v súboroch JSONL) znamená, že nie je.
File Identifikuje zdrojový súbor, z ktorého pochádza zamietnutý riadok. Táto hodnota vám pomáha vystopovať zamietnuté dáta späť do pôvodného vstupného súboru na preskúmanie.
ErrorRowLocation Pozícia posunu bajtu v zdrojovom súbore, kde došlo k zlyhaniu.

Preskúmajte zamietnuté riadky

Po preštudovaní štruktúrovaných diagnostických informácií môžete skontrolovať pôvodné zdrojové dáta, ktoré databáza nedokázala absorbovať. Výstup zamietnutých riadkov obsahuje kópie zdrojových záznamov, zachované presne tak, ako sa objavili vo vstupných súboroch. Diagnostika zamietnutých riadkov generuje súbory, ktoré obsahujú iba záznamy, ktoré zlyhali pri prijatí:

  • Ak importujete CSV súbory pomocou COPY INTO (FILE_TYPE = 'CSV'), zamietnutý výstup obsahuje súbor.row.csv Tento súbor zodpovedá štruktúre zdrojového súboru a obsahuje pôvodné CSV riadky s neplatnými hodnotami.
  • Ak importujete JSONL súbory pomocou OPENROWSET(FORMAT = 'JSONL'), odmietnutý výstup obsahuje súbor.row.jsonl Tento súbor uchováva pôvodné JSON objekty, ktoré spôsobovali zlyhania príjmu.

Použite tieto súbory na overenie príčiny chýb, ako sú deformované hodnoty, neočakávané NULL hodnoty alebo riadky hlavičky, ktoré boli nesprávne spracované ako dáta.

SELECT *
FROM OPENROWSET(
    BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);

Schéma row.csv zodpovedá zdrojovému CSV tvaru a obsahuje len riadky, ktoré zlyhali pri zadávaní.

Príklad výstupu s zamietnutým riadkom:

C1 C2 C3 C4 C5 C6 C7 C8 C9 C10
vendorID startLat startLon endLat endLon passengerCount tripDistance fareAmount mtaTax totalAmount
NULL 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 základe týchto diagnostických informácií môžete identifikovať nasledujúce problémy s požitím:

  • Riadok hlavičky v zdrojovom súbore je omylom parsovaný ako dátový riadok. Na vyriešenie by sa COPY INTO vo vyhlásení mala použiť táto FIRSTROW = 2 možnosť.
  • Riadok v zdrojovom súbore pre stĺpec vendorID (C1) obsahuje NULL hodnoty, ale príslušný stĺpec v cieľovej tabuľke TaxiTrips je definovaný ako NOT NULL.
  • Riadok v zdrojovom súbore pre stĺpec passengerCount obsahuje neplatnú hodnotu (N/A), ktorú nie je možné previesť na cieľový stĺpec int .

Poznámka

Rovnaký postup platí, keď skúmate zamietnuté riadky z JSONL vstupu. Použite row.jsonl súbor na kontrolu zamietnutých záznamov.

Oprava problémov s príjmom a opätovný príjem dát

Keď identifikujete príčinu zlyhaní príjmu, opravte problém a znovu načítajte postihnuté dáta. Prístup k náprave závisí od toho, odkiaľ chyba pochádza.

Opravte schému cieľovej tabuľky

Ak zdrojové dáta nezodpovedajú cieľovej schéme tabuľky, aktualizujte definíciu tabuľky. Bežné opravy zahŕňajú zmenu dátových typov stĺpcov alebo odstránenie obmedzení, ako je NOT NULL.

V niektorých prípadoch možno budete musieť pred opätovným vložením dát vyhodiť a znovu vytvoriť cieľovú tabuľku.

Správna zdrojová dáta a opätovné ingestovanie súborov

Ak príjem zlyhá kvôli neplatným alebo nekonzistentným hodnotám v zdrojových súboroch, opravte tieto hodnoty a znovu načítajte dáta. Napríklad nahraďte zástupné hodnoty, ako sú N/A prázdne hodnoty alebo platné predvolené hodnoty.

COPY INTO [dbo].[TaxiTrips]
FROM 'https://{storage-path}.blob.core.windows.net/Files/yellow/tripdata_corrected.csv'
WITH ( FILE_TYPE = 'CSV' );

Pri opätovnom vkladaní opravených dát použite explicitnú cestu k súboru, ktorá ukazuje na nový súbor obsahujúci iba opravené dáta, namiesto cesty po priečinku, ktorá odkazuje na pôvodné súbory. Tento prístup zabraňuje opätovnému vkladaniu riadkov, ktoré boli predtým úspešne načítané, a zabraňuje duplicitným dátam.

Opätovné spracovanie zamietnutých riadkov pomocou staging tabuľky

Môžete načítať odmietnuté riadky do staging tabuľky, opraviť dáta pomocou Transact-SQL príkazov na úpravu dát a potom znovu načítať opravené riadky.

Nasledujúci CREATE TABLE AS SELECT príkaz načíta zamietnuté riadky do tabuľky na ďalšie spracovanie:

CREATE TABLE TaxiTrip_RejectedRows AS
SELECT *
FROM OPENROWSET(
    BULK 'https://{storage-path}.blob.core.windows.net/Files/yellow/_rejectedrows/*/*/row.csv'
);

Po oprave dát vložte vyčistené riadky do cieľovej tabuľky.