Verwerking van zeer grote tekstbestanden in JSON-, NDJSON-, CSV- en XML-formaat in SQL

Go to English version

Voorheen was Invantive SQL niet in staat om relationele data te verwerken in tekstbestanden met een grootte groter dan meestal 1 GB. Vanaf BETA-release 22.1.56 maken een aantal optimalisaties het mogelijk om grote tekstbestanden van meer dan 1 GB groot in de volgende formaten te verwerken:

  • CSV (door komma’s gescheiden waarden), met csvtable
  • JSON, met jsontable
  • NDJSON, met ndjsontable
  • XML-document, met xmltable.

Alle vier de varianten vereisen het gebruik van de passing file-syntax in plaats van de passing-syntax met de bestandsinhoud dat in een eerdere stap is opgehaald, zoals met read_file_contents_text@os. Het gebruik van passing file maakt de geheugenoptimalisaties mogelijk.

Zowel de exceltable als htmltable bieden geen ondersteuning voor zeer grote tekstbestanden. Echter, gegevensbestanden in de bijbehorende bestandsformaten *.xlsx en *.html zijn tot nu toe nog nooit in het wild gezien door ons team met een bestandsgrootte van meer dan 1 GB.

Zowel het verbruik van CPU-tijd als het benodigde interne geheugen kan nog steeds extreem groot zijn. Zorg voor de aanwezigheid van intern geheugen met 8x de grootte van het bestand dat wordt verwerkt. Het werkelijke geheugenverbruik kan sterk variëren en zelfs heel weinig zijn, maar zorg er voor een eerste test voor dat voldoende geheugen aanwezig is.

Bestaande, maar onontdekte hindernissen kunnen aan de oppervlakte komen. Maak a.u.b. een nieuw onderwerp aan als een probleem optreedt bij het verwerken van zeer grote tekstbestanden.

Rijen met gegevens kunnen streaming of batched worden geretourneerd, afhankelijk van de huidige architectuur. Gebruik een query met een lage waarde voor limit om te testen of grote bestanden streaming of batched verwerkt worden in een formaat.

SQL-statements voor grote tekstbestanden

De volgende SQL-statements kunnen worden gebruikt als uitgangspunt voor de vereiste syntax:

select *
from   jsontable
       ( '[*]' 
         passing file 'c:\temp\large.json'
         columns c varchar2 path 'key'
       )
limit 10

select *
from   ndjsontable
       ( passing file 'c:\temp\large.ndjson'
         columns c varchar2 path 'key'
       )
limit 10

select *
from   csvtable
       (  passing file 'c:\temp\large.csv'
          columns c varchar2 position 1
       )
limit 10


select *
from   xmltable
       ( '/root' 
         passing file 'c:\temp\large.xml'
         columns c varchar2 path './name'
       )
limit 10