Fünf Dinge, die wir mit OpenRefine nicht (gerne) machen

Wrong way sign on South Main Street, Las Vegas, United States. Photo by NeONBRAND on Unsplash.

Wir haben uns in den letzten Wochen im Blog ausgiebig mit OpenRefine beschäftigt und wollen einmal festhalten, wozu es sich unserer Ansicht nach nicht eignet.

Batchverarbeitung

Die Idee von Batchverarbeitung von Daten mit OpenRefine (Automating OpenRefine) ist relativ simpel: es wird eine Datei mit OpenRefine bearbeitet und die History anschließend mit einem Programm wie openrefine-batch auf die anderen Dateien angewendet.

flowchart TD openrefine[fas:fa-gem OpenRefine] openrefine2[fas:fa-gem OpenRefine] hist[fas:fa-file-code History] subgraph input[fas:fa-sign-out-alt Input] file1.xml[fas:fa-file-alt] file2.xml[fas:fa-file-alt] filex.xml[fas:fa-file-alt] end subgraph output[Output fas:fa-sign-in-alt] file1.csv[fas:fa-file-excel] file2.csv[fas:fa-file-excel] filex.csv[fas:fa-file-excel] end filex.xml --> openrefine --> filex.csv openrefine --> hist --> openrefine2 input --> openrefine2 --> output

Das funktioniert, solange die Dateien alle genau die gleichen Strukturen und Inhalte haben (Happy Path). Problematisch wird es bei der Fehlerbehandlung oder Verzweigungen. Wir haben in unserem Artikel Findbuch Daten mit OpenRefine wiederverwenden über die Anwendung der History auf weitere Findbücher berichtet. Dort hatten wir unter anderem das Problem, dass die Kopfzeilen eine andere Struktur hatten. Das lässt sich zwar in vielen Fällen mit Kontrollstrukturen in OpenRefine abbilden, jedoch wird die Umsetzung schnell komplex.

Big Data

Mit Big Data meinen wir hier Datensätze, die auf Grund ihrer Größe nicht im Arbeitsspeicher (RAM) gehalten werden können. Je nach Rechner, kann das schon bei Datensätzen mit einer Dateigröße unter einem Gigabyte der Fall sein.

OpenRefine wurde so entwickelt, dass es ohne externe Datenbank funktioniert. Stattdessen werden die Daten im Speicher vorgehalten (siehe Technology Stack). Dadurch können und sollen Datensätze ab einer bestimmten Größe mit OpenRefine nicht mehr verarbeitet werden. 1

In der Dokumentation zu OpenRefine steht, dass schon ab einer Dateigröße von mehr als 50 Megabyte, die Standardeinstellungen von OpenRefine anzupassen sind (Increasing memory allocation).

XML Transformationen

OpenRefine kann XML einlesen, verarbeiten und ausgeben, es kann Daten als Tabelle darstellen und mit dem Konzept von Records baumartige Strukturen zugänglich machen.

Das Problem ist, dass XML noch “mehr” kann. In einer XML Datei können mehrere unterschiedliche Tabellen, Bäume und Netze gespeichert werden. Diese lassen sich als Gesamtwerk in OpenRefine nicht sinnvoll darstellen und daher nicht komfortabel bearbeiten.

Bei der Verarbeitung von XML mit OpenRefine kommt es also auf die Struktur der Daten in der XML Datei an. Daher verwenden wir besonders bei XML Transformationsaufgaben häufig andere Technologien und Tools, die explizit für die Arbeit mit XML entwickelt wurden.

Tabellenkalkulation

Die folgende Tabelle ist in einer Software für Tabellenkalkulation wie MS Excel oder LibreOffice Calc in Sekunden erzeugt. Als Bonus kann die Summenzeile als Formel definiert werden, die bei Änderungen automatisch die Werte aktualisiert.

JahrSpalte 1Spalte 2Spalte 3
2019147
2020258
2021369
Summe:61524

In OpenRefine ist das Hinzufügen einer Summenzeile im Vergleich ziemlich aufwendig, inklusive Transponieren der Tabelle, da nur neue Spalten hinzugefügt werden können. Eine automatische Aktualisierung der Summenzeile via Formel ist aktuell nicht möglich.

Zeilenübergreifende Operationen

OpenRefine arbeitet spaltenorientiert und tut sich schwer damit zeilenübergreifend zu agieren. Ein Beispiel ist die Berechnung der kumulierten Werte wie in der folgenden Tabelle.

WertKumuliert
11
23
36

Das Problem ist, dass es in OpenRefine keine (direkte) Möglichkeit gibt, auf eine Spalte zuzugreifen. Der Zugriff auf die aktuelle Zeile mit row.cells funktioniert problemlos!

Hierfür gibt es zwei Workarounds:

  1. Verwendung der cross() Funktion.
  2. Die Tabelle zu einem einzelnen Recordeintrag machen. Innerhalb eines “record” lässt sich via row.record.cells auf alle Spalten des “record” zugreifen.

Beide Varianten sind jedoch wenig intuitiv.

Fazit

OpenRefine kann schnell zu “Maslows Hammer” werden. Mit diesem Artikel wollen wir einige Probleme zeigen, die sich nach unserer Erfahrung mit OpenRefine nicht oder im Vergleich mit anderen Werkzeugen nur sehr aufwendig lösen lassen.

Nachtrag: der Artikel wurde auch auf der OpenRefine Dev Mailingliste kommentiert.


  1. Dies ändert sich mit OpenRefine 4.0 und der geplanten Unterstützung von Apache Spark↩︎

Benjamin Rosemann
Benjamin Rosemann
Data Scientist

Ich evaluiere KI- und Software-Lösungen und integriere sie in den Archivalltag.

Ähnliches