Ga naar hoofdinhoud Ga naar aanvullende inhoud

Store

De Store-instructie genereert een QVD-, Parquet-, CSV- of TXT-bestand.

Syntaxis:  

Store [ fieldlist from] table into filename [ format-spec ];

De opdracht maakt een expliciet genoemd QVD, Parquet of tekstbestand aan.

De opdracht kan alleen velden exporteren uit één gegevenstabel, tenzij u opslaat in Parquet. Als velden uit diverse tabellen moeten worden geëxporteerd in een QVD-, CSV- of TXT-bestand, moet eerst een expliciete join in het script worden opgegeven om de te exporteren gegevenstabel te maken. U kunt meerdere tabellen in één Parquet opslaan door de gegevens in de Parquet-bestanden te nesten.

De tekstwaarden worden in de indeling BOM naar het CSV-bestand in UTF-8geëxporteerd. U kunt een scheidingsteken opgeven, zie LOAD. De store-opdracht voor een CSV-bestand ondersteunt geen BIFF-export.

InformatieIn sommige gevallen met gegevens die niet goed gevormd zijn, worden velden tussen dubbele aanhalingstekens geplaatst om er zeker van te zijn dat de gegevens correct worden geïnterpreteerd. Dit kan bijvoorbeeld gebeuren als het veld tekens bevat zoals aanhalingstekens, komma's, spaties of regeleinden.

U kunt specificeren of u uw bestand wilt opslaan in uw persoonlijke ruimte of in een gedeelde ruimte waar u schrijfmachtigingen hebt. Als u in een gedeelde ruimte opslaat, kunnen leden die gegevens gebruiken om apps in de ruimte te maken. Zie: Machtigingen in gedeelde ruimtes beheren.

Argumenten:  

Opdrachtargumenten opslaan
Argument Beschrijving
fieldlist::= ( * | field) { , field } )

Een lijst van de te selecteren velden. Met een * als veldlijst worden alle velden aangeduid. 

field::= fieldname [as aliasname ]

fieldname is een tekst die identiek is aan een veldnaam in table. (Houd er rekening mee dat de veldnaam tussen rechte dubbele aanhalingstekens of vierkante haken moet staan als deze spaties of andere niet-standaardtekens bevat.)

aliasname is een alternatieve naam voor het veld, te gebruiken in het resulterende QVD- of CSV-bestand.

table Een scriptlabel representeert een reeds geladen tabel die als gegevensbron wordt gebruikt.
filename

De naam van het doelbestand inclusief een geldig pad naar een bestaande mapgegevensverbinding. Zie Regels voor geldige mappaden voor ruimten voor meer informatie over wat als een geldig pad wordt beschouwd.

In Qlik Cloud Analyse worden hiërarchische mapstructuren ondersteund en kan ernaar worden verwezen in de instructie.

Voorbeelden:  

  • Persoonlijke ruimte (pad op het hoogste niveau): [lib://DataFiles/abc.qvd]

  • Persoonlijke ruimte (geneste map): [lib://DataFiles/MyFolder/abc.qvd]

  • Gedeelte ruimte (pad op het hoogste niveau): [lib://TeamSharedSpace:DataFiles/xyz.qvd]

  • Gedeelde ruimte (geneste map): [lib://TeamSharedSpace:DataFiles/MyFolder/abc.qvd]

Voor meer informatie en voorbeelden raadpleegt u Bestanden opslaan in ruimten in Qlik Cloud Analyse.

format-spec ::=( ( txt | qvd | parquet), compressie is codec)

U kunt de indelingsspecificatie instellen voor een van deze bestandsindelingen. Als de opmaakspecificatie wordt weggelaten, wordt qvd verondersteld.

  • txt voor CSV en TXT-bestanden.

  • qvd voor QVD-bestanden.

  • parquet voor Parquet-bestanden.

Als u parquet gebruikt, kunt u ook instellen welke compressiecodec met compressie is moet worden gebruikt. Als u de compressiecodec met compressie is niet opgeeft, wordt snappy gebruikt. De volgende compressie-instellingen zijn beschikbaar:

  • uncompressed

  • snappy

  • gzip

  • lz4

  • brotli

  • zstd

  • lz4_hadoop

Voorbeeld:

Store mytable into [lib://DataFiles/myfile.parquet] (parquet, compression is lz4);

InformatieBestandsextensies van DataFiles-verbindingen zijn hoofdlettergevoelig. Bijvoorbeeld: .qvd.

Voorbeelden:  

Store mytable into [lib://DataFiles/xyz.qvd];

Store * from mytable into [lib://DataFiles/myfile.qvd];

Store Name, RegNo from mytable into [lib://DataFiles/xyz.qvd];

Store Name as a, RegNo as b from mytable into [lib://DataFiles/myfile.qvd];

Store mytable into [lib://DataFiles/myfile.txt] (txt);

Store mytable into [lib://DataFiles/myfile.parquet] (parquet);

Store * from mytable into [lib://DataFiles/myfile.csv] (txt);

Store * from mytable into [lib://TeamSharedSpace:DataFiles/myfile.qvd];

Opslaan in Parquet-bestanden

Parquet is een sterk getypeerde bestandsindeling, waarbij elk veld een afzonderlijk specifiek type gegevens bevat (zoals in32, double, tijdstempel of tekst). Qlik Sense slaat interne gegevens op als een zwak getypeerde dual, waarbij gegevens van verschillende bronnen in dezelfde velden gecombineerd kunnen worden. Omdat maar één deel van de dual opgeslagen kan worden in elk veld in Parquet, is het belangrijk om te weten wat elk veld bevat. Qlik Sense gebruikt standaard het veldtype om te bepalen hoe het veld moet worden opgeslagen. U moet het gegevenstype van uw velden opgeven voor het laden als u gegevens in Parquet-bestanden in een specifieke indeling opslaat. Als u probeert om gegevens op te slaan in niet-compatibele velden in een Parquet-bestand, zoals getallen in een tekstveld of tekst in een tijdstempelveld, krijgt u null-waarden.

Het is mogelijk om het standaardgedrag te wijzigen als u gegevens laadt die u in Parquet wilt opslaan. U kunt instellen dat uw gegevenstype wordt gewijzigd of u kunt gegevens taggen om specifieke kolomtypen in Parquet af te dwingen.

Gegevens opmaken voor opslag in Parquet

U kunt Qlik Sense-opmaakfuncties gebruiken om uw gegevens te classificeren. Text(), Num(), Interval() of Timestamp() kunnen bijvoorbeeld gegevensopmaak afdwingen bij het opslaan van gegevens in Parquet. Qlik Sense kan gegevens opslaan in bijna 20 gegevenstypen, afhankelijk van de veldkenmerken en automatische veldtags. Ga voor meer informatie naar Interpretatiefuncties.

Voorbeeld: Gegevens opmaken met Num() en Text()

Het volgende voorbeeld toont hoe u gegevens voorbereidt die u wilt opslaan in Parquet. Num() wordt toegepast op het getalveld. Text() wordt toegepast op tekst en gemengd. In het geval van een gemengd veld, voorkomt Text() dat het wordt verwerkt als een getalveld in Parquet en worden de tekstwaarden gewijzigd in null-waarden.

Data: LOAD * INLINE [ num, text, mixed 123.321, abc, 123 456.654, def, xyz 789.987, ghi, 321 ]; Format:
NoConcatenate LOAD num, text, Text(mixed) as mixed RESIDENT Data; STORE Format INTO [lib://DataFiles/Tmp.parquet] (parquet);

Gegevens taggen voor opslag in Parquet

U tagt uw gegevens met $parquet-tags om specifieke kolomtypen af te dwingen bij het opslaan van gegevens in Parquet. Elk gegevenstype kan worden afgedwongen door de bijbehorende controletag toe te voegen. Stel dat u een veld als INT32 in Parquet wilt opslaan, tag dit dan met $parquet-int32 in het load-script. Afhankelijk van het gegevenstype wordt de tekenreeks of de numerieke weergave van de dubbele gegevens opgeslagen.

U kunt de volgende Parquet-controletag gebruiken om velden te taggen voor opslag in Parquet-bestanden.

Parquet-controletags
ControletagDualFysiek typeLogisch typeGeconverteerd type
$parquet-booleanGetalBOOLEANNONENONE
$parquet-int32GetalINT32NONENONE
$parquet-int64GetalINT64NONENONE
$parquet-floatGetalFLOATNONENONE
$parquet-doubleGetalDOUBLENONENONE
$parquet-bytearrayTekenreeksBYTE_ARRAYNONEUTF8
$parquet-bytearrayfixGetalFIXED_LEN_BYTE_ARRAYNONEDECIMAL
$parquet-decimalGetalINT64DECIMALDECIMAL
$parquet-dateGetalINT32DateDate
$parquet-timeGetalINT64TIMETIME_MICROS
$parquet-timestampGetalINT64TIMESTAMPTIMESTAMP_MICROS
$parquet-stringTekenreeksBYTE_ARRAYSTRINGUTF8
$parquet-enumTekenreeksBYTE_ARRAYENUMENUM
$parquet-intervalGetalFIXED_LEN_BYTE_ARRAYINTERVALINTERVAL
$parquet-jsonTekenreeksBYTE_ARRAYJSONJSON
$parquet-bsonTekenreeksBYTE_ARRAYBSONBSON
$parquet-uuidTekenreeksFIXED_LEN_BYTE_ARRAYUUIDNONE

Voorbeeld: Gegevens taggen voor opslag in Parquet

In dit voorbeeld worden twee tags gebruikt om de gegevens voor Parquet te definiëren. Het veld num is getagd met $parquet-int32 om het te definiëren als getalveld dat in Parquet als INT32 wordt ingesteld.

Data: LOAD * INLINE [ num, text, 123.321, abc 456.654, def 789.987, ghi ]; TAG num WITH '$parquet-int32'; STORE Format INTO [lib://DataFiles/Tmp.parquet] (parquet);

Geneste gegevens opslaan in Parquet-bestanden

U kunt meerdere tabellen opslaan in een Parquet-bestand door ze te nesten in gestructureerde gegevens. Store ondersteunt gestructureerde knooppunten en lijstknooppunten in een sterrenschema. Afzonderlijke tabellen kunnen ook in de geneste modus worden opgeslagen met behulp van de specificatie Scheidingsteken is.

Wanneer u tabellen opslaat, kunt u de gewenste tabellen specificeren door ze te scheiden met komma's. Bijvoorbeeld: STORE Table1, Table2, Table3 INTO [lib://<file location>/<file name>.parquet] (parquet);. U kunt bepalen welke velden worden opgeslagen door een veldlijst te gebruiken in de Store-opdracht. Bijvoorbeeld STORE Field1, Field2, FROM Table1, Table2 INTO [lib://<file location>/<file name>.parquet] (parquet);. Alle velden in de veldenlijst moeten in één of meer van de vermelde tabellen staan. De eerste tabel in de Store-instructie wordt gebruikt als de feitentabel in het sterrenschema.

Veldnamen worden gebruikt om te beheren hoe groepen worden gemaakt en genest. Standaard worden veldnamen met een punt (.) opgesplitst in knooppunten. Het scheidingsteken kan worden gewijzigd door de systeemvariabele FieldNameDelimiter in te stellen of door de specificatie Scheidingsteken is te gebruiken. De specificatie overschrijft de systeemvariabele.Ga voor meer informatie naar Werken met variabelen in de editor voor het laden van gegevens.

Veldnamen worden opgesplitst door het scheidingsteken en de onderdelen worden gebruikt om het schema met geneste groepen te maken. STORE Field1, Field1.Field2, Field1.Field3, Field1.Field4 FROM Table1 INTO [nested.parquet] (parquet, delimiter is '.'); maakt bijvoorbeeld twee groepen (Group1 en Group2) met Fields1, Field2 en Field3, Field4.

InformatieGroepen en velden mogen niet dezelfde naam hebben in een knooppunt in het schema. STORE Address, Address.Street INTO [nested.parquet] (parquet, delimiter is '.''); zal bijvoorbeeld mislukken omdat Address dubbelzinnig is en zowel een gegevensveld als een groep is.

Wanneer geneste gegevens in Parquet worden opgeslagen, worden sleutels tussen tabellen omgezet in link-knooppunten in het schema. De tabellen worden omgezet in gestructureerde knooppunten in het schema. U kunt de standaardtransformatie overschrijven met veldnamen.

Voorbeeld: Geneste gegevens opslaan in Parquet-bestanden

company: LOAD * INLINE [ company, contact A&G, Amanda Honda Cabro, Cary Frank Fenwick, Dennis Fisher Camros, Molly McKenzie ]; salesrep: LOAD * INLINE [ company, salesrep A&G, Bob Park Cabro, Cezar Sandu Fenwick, Ken Roberts Camros, Max Smith ]; headquarter: LOAD * INLINE [ company, country, city A&G, USA, Los Angeles Cabro, USA, Albuquerque Fenwick, USA, Baltimore Camros, USA, Omaha ]; region: LOAD * INLINE [ region, city West, Los Angeles Southwest, Albuquerque East, Baltimore Central, Omaha ]; STORE company, salesrep, headquarter, region INTO [lib://DataFiles/company.parquet] (parquet) DROP TABLES company, salesrep, headquarter, region;

Het resulterende Parquet-bestand heeft het volgende schema:

company (String) contact (String) company:salesrep (List) salesrep (Group) salesrep (String) company:headquarter (List) headquarter (Group) country (String) city (String) city:region (List) region (Group) region (String)

Beperkingen

Geneste gegevens opslaan in Parquet heeft de volgende beperkingen:

  • Opslag ondersteunt geen kaartknooppunten.

  • Tijdens het opslaan worden sleutelvelden die zijn gegeneerd vanuit het laden van geneste Parquet-bestanden niet toegevoegd.

  • U kunt gegevens uit tabellen niet samen opslaan als ze niet zijn gekoppeld aan sleutelvelden.

  • Het geneste bestand denormaliseert het gegevensmodel. Waarden waar niet naar wordt verwezen, worden niet opgeslagen en waarden waar meerdere keren naar wordt verwezen, worden gekopieerd.

Bestanden opslaan in ruimten in Qlik Cloud Analyse

Als u een Store-instructie gebruikt in een load-script in Qlik Cloud, kunt u verwijzen naar de exacte map in een ruimte waar u de gemaakte bestanden wilt opslaan. Volg de regels voor geldige mappaden voor ruimten. En het volgende gedrag is ook van toepassing en is uniek voor Store-instructies:

  • Als de ruimte bestaat maar het opgegeven pad van de map niet, wordt het pad gemaakt in de ruimte. Afhankelijk van de gedefinieerde mappenstructuur kunnen één of meer mappen worden aangemaakt. Het bestand wordt daar gegenereerd en opgeslagen.

  • Als de ruimte bestaat, maar in het opgegeven mappad ongeldige scheidingstekens voor mappen worden gebruikt (bijvoorbeeld \, \\, //, /./, of /../), wordt de Store-instructie toch uitgevoerd. Het uitvoerbestand wordt in plaats daarvan opgeslagen op het pad op het hoogste niveau in de doelruimte en krijgt een naam die het volledige pad bevat, niet alleen de opgegeven naam.

  • Als de ruimte niet bestaat, kan de Store-instructie niet worden uitgevoerd en wordt er een fout geretourneerd.

De volgende voorbeelden laten zien hoe u kunt verwijzen naar een specifiek mappad in de ruimte binnen uw Store-instructie.

Voorbeeld: Bestand opslaan in het pad op het hoogste niveau van een ruimte

In dit voorbeeld wordt de volledige tabel mytable geëxporteerd naar Qlik Cloud Analyse als een bestand met de naam myfile.qvd. Het bestand wordt toegevoegd aan de gedeelde ruimte TeamSharedSpace. Het bestand bevindt zich niet in een specifieke map, maar op het pad op het hoogste niveau in de ruimte.

Store * from mytable into [lib://TeamSharedSpace:DataFiles/myfile.qvd];

Voorbeeld: Bestand opslaan in een specifieke mappad binnen een ruimte

In dit voorbeeld wordt de volledige tabel mytable geëxporteerd naar Qlik Cloud Analyse als een bestand met de naam myfile.qvd. Het bestand wordt toegevoegd aan de map SalesData in de ruimte TeamSharedSpace.

Store * from mytable into [lib://TeamSharedSpace:DataFiles/SalesData/myfile.qvd];

Zie Verwijzen naar een mapstructuur van de ruimte in app- en scriptontwikkeling voor meer informatie over het verwijzen naar maplocaties van ruimten in load-scripts.

Was deze pagina nuttig?

Als u problemen ervaart op deze pagina of de inhoud onjuist is – een typfout, een ontbrekende stap of een technische fout – laat het ons weten zodat we dit kunnen verbeteren!