Invertierte Datensätze

<< Click to Display Table of Contents >>

Navigation:  Daten und Datensatz > In- und Output von Datensätzen >

Invertierte Datensätze

Wenn es um höchste Geschwindigkeit bei der Auswertung geht und/oder sehr große Datensätze verarbeitet werden, ist eine invertierte Datei eine gute Option. In den meisten Datenformaten werden alle erhobenen Variablen zu einem Fall physikalisch zusammenhängend gespeichert. Bei einer Auswertung müssen alle „Fälle“ nacheinander gelesen werden. Effizienter ist eine invertierte Speicherung, die variablenweise organisiert ist. Dies erlaubt ein sehr effizientes Lesen, vor allem, wenn nur wenige Variablen benötigt werden. GESStabs bietet hierfür ein proprietäres Format (*.INV) an. Der idealtypische Anwendungsfall ist, wenn aus sehr großen Dateien einzelne Tabellen mit wenigen Variablen erzeugt werden sollen.

Wie invertierte Daten-Files

geschrieben,

gelesen und erweitert sowie

Alpha-Variablen behandelt werden,

wird in den folgenden Abschnitten beschrieben.


Daten-Output

Syntax:

INVERTOUT = <path>;

INVERTOUT erzeugt eine invertierte Datei. Ein invertiertes File ist nur ein Daten-File: weder VALUELABELS noch VARTITLE oder Texte sind darin enthalten. In dieser Hinsicht ist es mit einem CSVINFILE vergleichbar, mit einem Unterschied: der Zustand der MISSING-Values (das globale SETMISSING und variablenbezogene MISSING) werden übertragen.

Komprimierter Daten-Output

Syntax:

ZIPINVERTOUT = [ YES | NO ];

Die Daten in den invertierten Files können komprimiert gespeichert werden (ZIP), dies wird mit ZIPINVERTOUT gesteuert.

Maximale Fallzahl

Die Werte in den invertierten Dateien sind in Blöcken von x Fällen gespeichert. Diese Speichergröße beträgt im Standardfall 16384. Man kann sie mit INVERTOUTMAX anpassen.

Syntax:

INVERTOUTMAX = <number>;

Auszugebende Variablen

Syntax:

INVERTOUTVARS [ KEEPVARS | DELETEVARS ] = <varlist>;

Im Normalfall wird GESStabs alle bekannten atomaren Variablen in das INVERTOUT-File schreiben. Diese Variablenliste kann mit dem INVERTOUTVARS-Statement modifiziert werden: durch Angabe aller speichernden (KEEPVARS) oder aller auszulassenden (DELETEVARS) Variablen.

Zum Beispiel:

INVERTOUTVARS KEEPVARS = f1 f2 f19;

oder

INVERTOUTVARS DELETEVARS = q1 q2 q17 gewicht;

Die Reihenfolge der Variablen bleibt auch bei KEEPVARS konstant.

Enthält die Variablenliste den Namen einer unbekannten Variablen, ist das ein Syntaxfehler.

INVERTOUT-Files enthalten nur atomare Variablen. Für MULTIQ und DICHOQ werden alle atomaren Bestandteile gespeichert und die MultiQ/DichoQ werden durch geeignete Anweisungen in der *.INC-Datei nach dem Einlesen wieder hergestellt.

Ausgabe von Gewichten

Syntax:

INVERTFILEWEIGHTOUT = <variable>;

Analog zu SPSSWEIGHTOUT gibt es auch für INVERTOUT eine spezielle Anweisung, um mittels WEIGHTCELLS berechnete Gewichte in invertierte Dateien zu speichern: INVERTFILEWEIGHTOUT. Die Funktionsweise entspricht der von SPSSWEIGHTOUT: Das intern berechnete Gewicht wird vor dem Speichern des Falles in diese Variable kopiert. Existiert die Variable nicht, wird sie durch dieses Statement erzeugt.

UpdateInvert

Aktualisierter Daten-Output

Syntax:

UPDATEINVERT;

Wenn ein Tabellierlauf auf der Basis eines INVERTIN-Files stattfindet, kann mit UPDATEINVERT die Speicherung eines neuen INVERTOUT-Files eingeschaltet werden. Dieses Update hat denselben Namen wie das zurvor eingelesene invertierte Datenfile.

Das zur Eingabe benutzte INVERTIN-File wird als ein Archivfile gespeichert. Archivfiles haben einen Namen, der aus dem INVERTIN-Namen und einer Kennung (_<number>) besteht. <number> bezeichnet die Archiv-Folgenummer, die bei jedem weiteren UPDATEINVERT erhöht wird. Also:

aus TEST.inv würde TEST_1.inv,

aus TEST_1.inv würde TEST_2.inv

usw.

Parallel dazu werden jeweils Variablenbeschreibungen (siehe unten) nach demselben Schema geschrieben und archiviert.  

GESStabs prüft nicht, ob ein Update inhaltlich sinnvoll ist, also ob während des Laufs Daten oder Texte geändert wurden. Es entstehen also möglicherweise lediglich Kopien.

Technisch ist es so realisiert, dass ein neues INVERTOUT mit einem Tempname ($tmp_inv_xxxxxxxxxxx.inv, .inc, .json) geschrieben wird. Nach erfolgreichem Abschluss des Laufs werden die eingelesenen Dateien (INVERTIN) in den Archiv-Namen umbenannt und die temporären Dateien erhalten den Namen der eingelesenen Datei (INVERTIN). Die erforderlichen Löschungen und Umbenennungen werden in gtc.msg protokolliert.

Beachte: Ein explizites INVERTOUT und UPDATEINVERT in einem Lauf sind nicht erlaubt.


Daten-Input

InvertIn

Syntax:

INVERTIN = <path>;

INVERTIN liest ein invertiertes Daten-File ein. Es ist auch möglich, mehrere invertierte Systemdateien nacheinander einzulesen. Dies ermöglicht es unter anderem, unterschiedlich gewichtete Teilmengen in eine Gesamtdatei zusammenzufassen.

Im Anschluss an das INVERTIN-Statement sind die Variablennamen im GESS-Skript bekannt.

Das INVERTIN-Statement erkennt, ob es sich um komprimierte Daten (ZIP) handelt oder nicht.

Falls vorhanden, wird zur Interpretation von ALPHA-Variablen auch die Variablenbeschreibungs-Datei eingelesen (siehe unten).

Erweiterung bestehender invertierter Datensätze um zusätzliche Variablen

Kombinierte Anwendung von ASSOCFILE und UPDATEINVERT

Einfaches Beispiel:

Um zu einem bestehenden invertierten Datensatz neue Variablen hinzuzufügen, bietet sich ASSOCFILE an.

Gegeben sei ein invertiert gespeicherter Datensatz "test" mit den Dateikomponenten test.inv, test.inc und test.json. Die Fälle in test.inv haben einen eindeutigen Schlüssel "@sys_respid", der aus Q. stammt, und alphanumerisch ist. Außerdem möge es einen weiteren CSV-Datensatz namens "neu.csv" mit weiteren Variablen geben, in diesem Beispiel die Alpha-Variablen v1 und v2. Diese Datensätze haben einen Alpha-Schlüssel mit denselben Werten wie in "@sys_respid". Diese Schlüsselvariable muss einen abweichenden Namen haben und heißt hier "@assoc_respid".

Inhalt von neu.csv:

"@assoc_respid";"@v1";"@v2";

"ABC";"marta";"mühlhans";

"B";"kurt";"kicker";

"C";"herbert";"hummel";

Will man diesen zusätzlichen Datensatz in die Tabellierung einführen, reicht folgendes Skript-Schnipsel:

ASSOCFILE CSV = neu.csv KEY sys_respid assoc_respid;

ASSOCEND neu.csv;

An dieser Stelle heißen die ALPHA-Schlüssel-Variablen sys_respid und assoc_respid ohne @. @ dient nur zur Erkennung der alpha-Property  im Header der csv-datei, ist aber nicht Bestandteil des Variablennamens.

Das ASSOCFILE-Statement benötigt die Namen der Schlüssel im ursprünglichen und im zu ergänzenden Datensatz. Der ursprüngliche ist in diesem Fall ein invertierter Datensatz. Der invertierte Datensatz enthält zwar nur numerische Daten, aber durch die INC-Datei wird die Zuordnung von Code zu Alpha-Text übertragen. Durch ein abschließendes UPDATEINVERT; wird die invertierte Datei in dieser Form gespeichert.

Da die ergänzten Variablen vom Typ ALPHA sind, werden deren Zuordnungen von Text zu Code automatisch erzeugt und in der neu erzeugten INC-Datei abgelegt - siehe Behandlung von Alpha-Variablen. Wären die hinzugefügten Variablen nicht vom Typ ALPHA, müssten sinnvolle VALUELABELS-Statements von Hand ergänzt werden.


Behandlung von Alpha-Variablen

Der Inhalt invertierter Dateien ist auf numerische Werte beschränkt. Wenn Alpha-Variablen vorkommen, wird in der invertierten Datei physikalisch deren numerischer Wert abgelegt. Da beim Einlesen von Alpha-Variablen in GESStabs eine eindeutige Zuordnung zwischen Alpha-Texten und Code gebildet wird, sind diese Texte bei Bedarf wieder rekonstruierbar.

Die Zuordnungsmatrix 'Text zu Code' wird im Zuge von INVERTOUT automatisch erzeugt und in einer SYNTAX- und JSON-Beschreibung gespeichert bzw. bei INVERTIN automatisch wieder ausgelesen (sofern eine entsprechende Datei im Studienverzeichnis vorhanden ist). Voraussetzung ist, dass der Schalter NOINVERTADDON auf NO (Voreinstellung) steht.

Syntax:

NOINVERTADDON = [ YES | NO ];

Im Default erzeugt das INVERTOUT-Statement automatisch die Datensatzbeschreibungen in der .INC und .JSON-Datei, die im Zuge des INVERTIN-Befehls wieder eingelesen werden.

Mit NOINVERTADDON=YES; kann die automatische Generierung sowie das automatische Einlesen der Variablen-Beschreibung unterdrückt werden.