QVD-Dateien - was drin ist

QlikView und sein jüngerer Bruder QlikSense sind wunderbare BI-Tools, die in unserem Land und im Ausland sehr beliebt sind. Sehr oft speichern diese Systeme „Zwischenergebnisse“ ihrer Arbeit - Daten, die ihre „Dashboards“ visualisieren - in sogenannten „QVD-Dateien“. In mehrstufigen ETL-Prozessen, die auf Qlik basieren, werden häufig QVD-Dateien als Hauptspeicher verwendet. Und dann haben einige (zum Beispiel ich - ich beschäftige mich mit Data Engineering im Unternehmen) eine Frage - ist es möglich und wie kann man diese Daten ohne QlikView / QlikSense verwenden? Oder eine andere - und was ist da und ist es richtig, dass es gezählt wurde?


QVD ist ein für QlikView / QlikSense optimiertes Dateiformat (das Lesen vom Schreiben von Informationen dieser Anwendungen in Dateien dieses Formats ist viel schneller als in Dateien eines anderen Formats). Die Struktur dieser Datei ist nicht dokumentiert und mit einem "düsteren Eigentum" versehen. Es gibt praktisch keine Anwendungen, die mit solchen Dateien arbeiten können (lesen und noch mehr schreiben). In dieser Artikelserie werde ich meine Erfahrungen und praktischen Erkenntnisse teilen: Ich weiß, wie QVD funktioniert, ich kann direkt und schnell lesen und schreiben.


Wer wird an diesen Informationen interessiert sein: vor allem diejenigen, die mit QlikView / QlikSense arbeiten, sowie diejenigen, die (wie ich) die in QVD-Dateien gespeicherten Daten verwenden möchten. Und natürlich für alle Neugierigen.


Alles, was in dieser Serie geschrieben wurde, basiert auf meiner persönlichen Erfahrung, die natürlich keine „Dokumentation“ oder „Garantie“ ist (dass Ihre Dateien genau so sind, wie ich es beschrieben habe. Oder dass es für immer sein wird ) Ich kann auch nicht garantieren, dass ich alle Fälle herausgefunden habe - es kann sicher sein, dass es Dateien gibt, die etwas enthalten, das nicht von mir beschrieben wurde (schon allein, weil ich nicht auf solche Optionen gestoßen bin). Ich muss jedoch beachten, dass die Informationen in einem großen (mehreren hundert) Satz von Dateien überprüft werden, die von verschiedenen Personen aus verschiedenen Systemen mit verschiedenen Versionen von QlikView / QlikSense erstellt wurden.


Und ein wenig darüber, wie ich es gemacht habe: Ich habe mit einem einfachen begonnen - einem kleinen Inline-Beispiel, das in QVD gespeichert ist. Weiter - die Analyse der Binärdatei, Gehirnbemühungen, Tests und Fehler. Mit Blick auf die Zukunft (ich werde im Abschluss der Serie ausführlicher darauf eingehen) konnte ich QVD-Dateien mittlerer Größe (Hunderte von Gigabyte) recht effizient lesen und schreiben. Der Ausgangspunkt meiner Reise in die QVD-Welt war dieser GitHub , vielen Dank an den Autor (versucht ihn zu kontaktieren - antwortet nicht).


Was war mein Ziel (neben der Neugier und dem Wunsch, die Richtigkeit der Daten zu überprüfen, mit denen QlikView / QlikSense arbeitet), musste ich den Inhalt der QVD-Datei lesen, d. H. Erstellen Sie darauf basierend eine relationale Tabelle neu. Laden Sie umgekehrt die relationalen Tabellendaten in QVD hoch, damit QlikView sie korrekt laden kann.


Wie ich diese Artikelserie sehe


  • Einführung, Dateistruktur, Metadaten (dieser Artikel)
  • Speicherung von Spalteninformationen
  • Speichern von Linieninformationen, Erfolgen, Plänen

Dateistruktur


Die QVD-Datei wird vom QlikView / QlikSense-Skript beim Laden von Daten in den Anwendungsspeicher (das Ergebnis des STORE-Befehls) erstellt und entspricht einer (relationalen) QlikView / QlikSense-Tabelle. Es besteht aus zwei Teilen


  • Text (Metadaten) und
  • binär (Spalten und Zeilen)

Metadaten werden als XML dargestellt (ein Beispiel wird unten angegeben). Der Binärteil beginnt unmittelbar nach dem Text und besteht aus zwei Blöcken


  • eindeutige Werte aller Spalten (Quelltabelle)
  • Zeilen (Quelltabelle), die auf eindeutige Spaltenwerte verweisen

Dateistruktur


Daher enthält die Datei für eine Tabelle mit N Spalten N + 1 Binärblöcke. Alle Teile der Feile sind „festgeklebt“ und verlaufen nacheinander ohne Füllstoffe und „Schenkel“.


Metadaten (XML)


Die QVD-Datei enthält viele Metadaten - "Daten über Daten". Es ist fast autark, urteilen Sie selbst, hier ist eine kurze Liste der Metadaten (ich werde sie unten genauer beschreiben):


  • Version der Software, die die Datei generiert hat
  • Datum und Uhrzeit der Dateierstellung
  • QlikView / QlikSense-Datei, deren Skript zur Erstellung der Datei führte
  • Skript-Quellcode, der die QVD-Datei generiert hat
  • Tabellenname
  • Spalteninformationen (Namen, Typen, Mengen eindeutiger Werte)
  • Zeilenanzahl

Metadaten werden in einer Datei in Textform gespeichert und können in jedem Programm angezeigt werden, das die Datei in Textform anzeigen kann (fast jedes ... in einer, die keine Angst vor großen Dateien hat). Persönlich betrachte ich die Metainformationen mit mehr - es ist sehr praktisch.
In der folgenden Präsentation werde ich die Testtabelle verwenden (ich verwende die QlikView-Syntax, aber ich denke, es wird leicht zu vermuten sein):


SET NULLINTERPRET =<sym>; tab1: LOAD * INLINE [ ID, NAME 123.12,"Pete" 124,12/31/2018 -2,"Vasya" 1,"John" <sym>,"None" ]; 

Ich werde als Beispiel die Metadaten für diese Platte geben


 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <QvdTableHeader> <QvBuildNo>7314</QvBuildNo> <CreatorDoc></CreatorDoc> <CreateUtcTime>2019-04-03 06:24:33</CreateUtcTime> <SourceCreateUtcTime></SourceCreateUtcTime> <SourceFileUtcTime></SourceFileUtcTime> <SourceFileSize>-1</SourceFileSize> <StaleUtcTime></StaleUtcTime> <TableName>tab1</TableName> <Fields> <QvdFieldHeader> <FieldName>ID</FieldName> <BitOffset>0</BitOffset> <BitWidth>3</BitWidth> <Bias>-2</Bias> <NumberFormat> <Type>0</Type> <nDec>0</nDec> <UseThou>0</UseThou> <Fmt></Fmt> <Dec></Dec> <Thou></Thou> </NumberFormat> <NoOfSymbols>4</NoOfSymbols> <Offset>0</Offset> <Length>40</Length> </QvdFieldHeader> <QvdFieldHeader> <FieldName>NAME</FieldName> <BitOffset>3</BitOffset> <BitWidth>5</BitWidth> <Bias>0</Bias> <NumberFormat> <Type>0</Type> <nDec>0</nDec> <UseThou>0</UseThou> <Fmt></Fmt> <Dec></Dec> <Thou></Thou> </NumberFormat> <NoOfSymbols>5</NoOfSymbols> <Offset>40</Offset> <Length>37</Length> </QvdFieldHeader> </Fields> <Compression></Compression> <RecordByteSize>1</RecordByteSize> <NoOfRecords>5</NoOfRecords> <Offset>77</Offset> <Length>5</Length> </QvdTableHeader> 

Meine Erfahrung mit QVD zeigt, dass sich die XML-Struktur nicht von Datei zu Datei ändert.


Ich werde die wichtigsten Metadatenelemente kommentieren.


allgemeine Informationen


QvBuildNo


Die Build-Nummer der QlikView / QlikSense-Anwendung, die die QVD-Datei generiert hat.


Creatordoc


In der Regel enthält es den Namen der QVW-Datei, deren Skript die QVD-Datei generiert hat. Dieses Beispiel ist leer, möglicherweise weil die Personal Edition verwendet wurde.


CreateUtcTime


Erstellungszeit für QVD-Dateien.


SourceCreateUtcTime, SourceFileUtcTime, SourceFileSize, StaleUtcTime


Ich habe die Dateien, in denen diese Felder ausgefüllt werden, nicht gesehen - für einen fragenden Verstand: Vielleicht fehlen einige Einstellungen?


Tablename


Der Name der Tabelle in QlikView (siehe Beispiel oben).


Informationen zu Feldern (Spalten)


Übrigens sind die Wörter "Feld" und "Spalte" für mich Synonyme. Seien Sie nicht beunruhigt, wenn ich beide verwende (ich werde versuchen, dies nicht zu tun, aber immer noch ...).


Informationen zu jedem Feld werden in QVD über gespeichert


Feldname


Der Name des Feldes (wiederum in Bezug auf QlikView, dh unter Berücksichtigung von "AS")


BitOffset, BitWidth, Bias


Lassen Sie uns zunächst überspringen - dies sind Informationen zum "Dekodieren von Zeichenfolgen", die wir im dritten Teil betrachten werden, wenn es um Zeichenfolgen geht.


Geben Sie, nDec, UseThou, Fmt, Dec, Thou ein


Gut durchdacht (nach den Namen zu urteilen), aber im Hinblick auf das Erreichen meiner Zielinformationen absolut nutzlos (weitere Einzelheiten finden Sie im zweiten Teil, in dem wir über Spalten sprechen werden). Warum ist es nutzlos? - Das Tag "Typ" korreliert nicht mit dem Datentyp, der im Binärteil gespeichert ist. Es ist unmöglich, den Spaltentyp daraus wiederherzustellen (es scheint einfacher zu sein, es gibt ein Type-Tag!). In 90% der Fälle ist der Wert dieses Tags die Zeichenfolge UNBEKANNT ...


In den Metadaten zu den Spalten sind noch solche Daten vorhanden (in den Metadaten des Beispiels ist dies anscheinend nicht auf die geringe Größe zurückzuführen).


 <Comment></Comment> <Tags> <String>$numeric</String> <String>$integer</String> </Tags> 

Der Kommentar benötigt keine Kommentare (die Dateien, mit denen ich gearbeitet habe, sind übrigens zu 100% leer ...).


Tags sind auch nutzlose Informationen (unter dem Gesichtspunkt der Wiederherstellung der Tabellenstruktur). Daraus können Sie jedoch grob erraten, welche Art von Informationen in der Spalte gespeichert sind. Ich werde im zweiten Teil ausführlicher auf das Tippen eingehen - wenn ich über Spalten spreche: Das ist wichtig. Aber etwas komplizierter als ich es gerne hätte.


NoOfSymbols


Die Anzahl der Einträge im Binärteil, die sich auf diese Spalte beziehen. Wie wir sehen, ist es in unserem Beispiel 5. Informationen, die für die Entschlüsselung sehr wichtig sind.


Offset


Der Versatz des Datenblocks dieser Spalte in Bytes relativ zum Anfang des binären Teils der Datei. Auch sehr wichtig.


Länge


Die Länge des gesamten Datenblocks dieser Spalte in Bytes. Beachten Sie, dass die binäre Darstellung eines Spaltenelements (Tabellenzelle) im Allgemeinen eine variable Länge hat (z. B. Zeile), sodass die Länge nicht berechnet werden kann. Sie können sie nur aus diesem Tag (Lächeln) entnehmen.


String-Informationen


Komprimierung


Nie ausgefüllt (in den Daten, mit denen ich gearbeitet habe). Vielleicht verwenden wir diese Option nicht ...


RecordByteSize


Die Größe des Zeileneintrags in Bytes. Alle Zeichenfolgen werden im binären Zeichenfolgenblock als Bitindex dargestellt (mehr dazu im dritten Teil). Ein Bitindex besteht aus Zeilen gleicher Länge.


NoOfRecords


Die Anzahl der Zeilen (im Bitindex und in der Quelltabelle).


Offset


Der Versatz des Bitindex (Block mit Zeichenfolgeninformationen) in Byte relativ zum Anfang des binären Teils der Datei.


Länge


Die Länge des Bitindex in Bytes.


In den Metadaten zu Zeichenfolgen gibt es immer noch solche Daten (wieder - ein kurzes Beispiel ermöglicht es Ihnen nicht, alles zu sehen, aber es ermöglicht Ihnen, den Komplex zu verstehen).


 <Lineage> <LineageInfo> <Discriminator>Provider=OraOLEDB.Oracle.1;Persist Security Info=True;Data Source=XXXX;Extended Properties=&quot;&quot;</Discriminator> <Statement>LinkTable: LOAD SOURCE_NAME &amp; '_' &amp; SOURCE_ID as SYSKEY, HID_PARTY;SQL SELECT * FROM UNITED_VIEW</Statement> </LineageInfo> <LineageInfo> <Discriminator>Provider=OraOLEDB.Oracle.1;Persist Security Info=True;Data Source=XXXX;Extended Properties=&quot;&quot;</Discriminator> <Statement>SQL SELECT * FROM UNITED_VIEW</Statement> </LineageInfo> <LineageInfo> <Discriminator>STORE - \\xxx.ru\mfs\SPECIAL\Qlikview\QVData\LinkTable.qvd (qvd)</Discriminator> <Statement></Statement> </LineageInfo> </Lineage> <Comment></Comment> 

Ich werde hier nicht zu sehr auf den Punkt eingehen, es ist ziemlich verständlich (die ursprünglichen SELECTs, die die Tabelle in QlikView generiert haben), ich habe es immer noch nicht herausgefunden (manchmal verdoppeln sie sich) ... (bis auf einen - 100% keine Kommentare (Lächeln)) .


Zusammenfassend


  • Die QVD-Datei ist in sich geschlossen (d. H. Sie kann isoliert von anderen Daten analysiert werden).
  • Die QVD-Datei besteht aus Textteilen (Metadaten) und Binärteilen (Spalten und Bitindex)
  • Metadaten sind XML mit klarer Semantik

Ein neugieriger Leser hat das Recht, hier zu fragen: "Bisher wurde nichts Neues gesagt, alles oben Genannte kann im XML-Header der QVD-Datei aufgenommen und angezeigt werden ... Dies wurde bereits viele Male in verschiedenen Internets darüber geschrieben. Was ist die Neuheit?" Das ist richtig - der erste Teil ist fast ausschließlich Metadaten gewidmet. Dies ist jedoch nicht das Ende.


Wie geht es weiter? Im nächsten Teil werden wir die Struktur des binären Teils der QVD-Datei mit Informationen zu den Spalten (eindeutige Werte aller Spalten der Tabelle) im Detail untersuchen.

Source: https://habr.com/ru/post/de454302/


All Articles