NDJSON naar SQL omzetten

Hier zet je NDJSON naar SQL om, gratis en zonder account: sleep het bestand hierboven erin en binnen een paar seconden staat het resultaat klaar om te downloaden. De omzetting gebeurt binnen je eigen browser, dus het bestand wordt nooit geüpload. Het werkt hetzelfde op Windows, macOS en Linux als op iPhone en Android, en het blijft werken als je de verbinding verbreekt.

  • Waar het draait In je browser. Het bestand wordt nooit geüpload.
  • Opnieuw opgebouwd SQL werkt anders dan NDJSON. Het is dus niet het geleidelijke kwaliteitsverlies van een lossy codec: wat SQL kan uitdrukken wordt getrouw weergegeven, en wat daar geen equivalent heeft blijft helemaal weg.
  • Maximale grootte Tot 100 MB per bestand, gratis en zonder account.
  • Goed om te weten Geneste objecten worden platgeslagen tot kolommen. Diep geneste gegevens verliezen hun vorm.

Tot 100 bestanden tegelijk. Verschillende formaten door elkaar is prima.

Eén regel wordt één statement, en het aantal klopt exact

Elke niet-lege regel van de bron levert precies één INSERT-statement op, dus de uitvoer telt evenveel statements als het bestand records heeft. Er is geen kopregel om rekening mee te houden, en niets in de data kan een regeleinde veroorzaken, want een newline binnen een string is in JSON al geëscaped.

Meldt een lading vierhonderdduizend rijen ingevoegd en had het bestand vierhonderdduizend regels, dan was de lading compleet — geen reconciliatie nodig en geen twijfel over een halve rij die door een aanhalingsteken is verdwenen.

Het hele bestand wordt gelezen voor het eerste statement er staat

De kolomlijst moet in elk statement identiek zijn, en die wordt opgebouwd uit de vereniging van alle sleutels over elke regel — een veld dat alleen in de laatste regel voorkomt, wordt dus toch een kolom, en er kan pas geschreven worden nadat alles gelezen is.

Het gevolg is een geheugengrens in plaats van een groottelimiet: tientallen megabytes is geen probleem, enkele honderden is waar een browser begint te hijgen. Voorbij dat punt is het bestand splitsen de aangewezen weg — NDJSON splitst veilig op elke regelgrens.

Verschillende gebeurtenistypen leveren een tabel vol NULL op

Een logstroom met verzoeken, fouten en voltooide taken in één bestand heeft drie verschillende sleutelverzamelingen. De herleiding laat niets weg — elke sleutel wordt een kolom, een regel zonder die sleutel krijgt NULL — en de tabel die daaruit volgt is de vereniging van drie schema’s.

Voor een middagje analyse is dat vaak prima. Voor iets dat langer meegaat, is het filteren per gebeurtenistype en drie tabellen laden meestal beter: dat levert een schema op dat zinvol te indexeren is.

De CREATE TABLE schrijf je zelf, op basis van het hele bestand

De uitvoer bevat bewust geen DDL. JSON vertelt of een waarde een getal is, niet of de kolom een integer of een numeriek veld met twee decimalen moet worden, of hij nullable is, of hoe lang de tekst mag zijn.

Leid de kolommen af van een omzetting van het hele bestand, nooit van een steekproef. Een zeldzaam veld dat in één regel van een half miljoen voorkomt, wordt toch een kolom in elk statement, en een tabel gedefinieerd op de eerste duizend records wijst dan de hele lading af op precies dat statement.

Geneste velden worden kolommen met een onderstreepje

Een geneste request-of context-blok wordt met onderstrepingstekens in de kolomnaam gevouwen: request.method wordt request_method. Eén of twee niveaus levert een tabel op die prima te declareren is, wat de meeste logbibliotheken dekken.

Een record met een volledig geserialiseerde payload levert een kolom per veld daarbinnen op, en dan is de nuttige vraag welke subboom je eigenlijk wilt bevragen. Die eruit halen vóór het omzetten geeft een smallere tabel.

Escaping, en de backslash die MySQL anders leest

Waarden worden geschreven als SQL-literals: getallen los, booleans als TRUE en FALSE, null als NULL, en tekst tussen enkele aanhalingstekens met interne aanhalingstekens verdubbeld — de draagbare vorm die elke engine leest.

Backslashes worden ongewijzigd doorgeschreven, wat correct is volgens de SQL-standaard maar niet hoe MySQL met standaardinstellingen een string leest, waar een backslash een escape start. Logdata staat er ongewoon vol mee — Windows-paden, reguliere expressies. Zet NO_BACKSLASH_ESCAPES voor de sessie, of laad in Postgres.

Een grote lading in redelijke tijd laten lopen

De statements komen zonder transactie eromheen. Zo uitvoeren maakt elk statement zijn eigen transactie met eigen commit en eigen rondgang — de traagste manier om een half miljoen rijen in te voegen.

Het bestand in BEGIN en COMMIT wrappen is één regel aan elk uiteinde en meestal de grootste enkele verbetering. Indexen tijdelijk verwijderen en na de lading opnieuw opbouwen is de tweede, en op een tabel met drie indexen halveert dat de tijd vaak nogmaals.

Wanneer COPY of LOAD DATA beter is dan een bestand met INSERTs

Voorbij een bepaalde omvang is een reeks statements het verkeerde instrument. Elke engine heeft een bulkroute — COPY in Postgres, LOAD DATA in MySQL — die een gescheiden bestand rechtstreeks leest en de statement-parsing overslaat.

Dezelfde NDJSON omzetten naar CSV of TSV en die route gebruiken is de betere keus boven ruwweg honderdduizend rijen. Statements houden wel twee voordelen: ze werken overal waar een client kan verbinden, en ze zijn te reviewen als fixture in een repository.

Een kapotte regel stopt de omzetting voordat er iets geladen wordt

Is een regel geen geldige JSON, dan mislukt de omzetting en de melding noemt het regelnummer. Er komt niets gedeeltelijks uit, en dat is precies het gedrag dat je hier wilt.

Een misvormde regel in een log betekent meestal een afgebroken schrijfactie, geen tikfout. Het regelnummer kennen betekent dat de staart afgeknipt kan worden en de rest bewust geladen, in plaats van een gat drie query’s later te ontdekken.

De omzetting draait lokaal

De statements worden gegenereerd door JavaScript in dit browsertabblad. Het bestand wordt niet geüpload, er is geen account en geen wachtrij, en de gratis laag accepteert tot 100 MB, met geheugen als de praktische grens.

Dat is voor dit paar geen bijzaak. Een logbestand is doorgaans het gevoeligste gewone bestand dat een ontwikkelaar tegenkomt — IP-adressen, sessie-ID’s, aanvraagpaden — en de reden om het om te zetten is meestal een incident, het slechtste moment om het naar een derde partij te sturen.

Zo zet je NDJSON naar SQL om

  1. Sleep je NDJSON-bestand op deze pagina, of klik om er een te kiezen.
  2. Kies SQL als doel. De omzetting gebeurt in je browser en het bestand wordt niet geüpload.
  3. Download het klare SQL-bestand.

NDJSON of SQL: wat er verandert

NDJSON vergeleken met SQL
NDJSONSQL
Volledige naamNewline-Delimited JSONSQL-INSERT-opdrachten
Bestandsextensie.ndjson, .jsonl.sql
Mediatypeapplication/x-ndjsonapplication/sql
Voor het eerst gepubliceerd20131986
SpecificatieISO/IEC 9075
LicentieOpen standaardOpen standaard
Stand van zakenActueelActueel
Opent in een browserGeen browserGeen browser
In plaats daarvan overwogenJSON, CSVCSV, Parquet

Het resultaat openen

De gebruikelijke programma's overlappen niet: NDJSON open je in jq en pandas, SQL in PostgreSQL, MySQL en DBeaver — wie het resultaat krijgt, heeft dus iets uit de tweede rij nodig.

Waarvoor elk formaat bedoeld is

SQL stamt uit 1986, vastgelegd in ISO/IEC 9075. PostgreSQL, MySQL en DBeaver lezen het formaat.

SQL verscheen in 1986 en NDJSON in 2013. Het oudste is doorgaans het veiligste bestand om te overhandigen; het nieuwste doet hetzelfde werk met minder bytes.

Van NDJSON naar SQL: veelgestelde vragen

Wordt mijn NDJSON-bestand ergens heen geüpload?

Nee. Deze omzetting gebeurt volledig in je browser, dus het bestand verlaat je apparaat niet. Je kunt het zelf nagaan: open het netwerktabblad van de ontwikkelaarshulpmiddelen en zet iets om. Je ziet de pagina zelf en de verzoeken voor statistiek en advertenties waarmee deze dienst betaald wordt, en geen enkel verzoek dat je bestand meeneemt.

Is NDJSON naar SQL omzetten gratis?

Ja. Geen account, geen watermerk en geen dagtegoed dat opraakt: het draait op je eigen machine, dus je mag zo vaak terugkomen als je wilt. De browser verwerkt bestanden tot 100 MB, 100 tegelijk.

Gaat er kwaliteit verloren bij het omzetten van NDJSON naar SQL?

NDJSON en SQL beschrijven de inhoud op fundamenteel andere manieren. De omzetting is daarom een reconstructie en geen kopie: getrouw, maar niet byte voor byte identiek. Geneste objecten worden platgeslagen tot kolommen. Diep geneste gegevens verliezen hun vorm.

Moet ik iets installeren om een SQL-bestand te openen?

Voor de omzetting niet: die gebeurt in de browser die je al open hebt staan. Om het resultaat te openen heb je daarna het programma nodig waarmee je apparaat SQL Insert Statements normaal weergeeft.

Meer over deze formaten