Dec 5th, 2019 [DE] Weihnachtswünsche zusammenfassen mit Transforms

Weihnachtswünsche zusammenfassen mit Transforms

Zu Weihnachten gibt es die schöne Tradition des Wunschzettels, Kinder können hier Ihre Wünsche aufschreiben, aber auch Sorgen und andere Dinge dem Weihnachtsmann mitteilen. In Deutschland gibt es mehrere Weihnachtspostämter, die jährlich hunderttausende Briefe beantworten, noch viel mehr Wunschzettel bleiben wahrscheinlich innerhalb der Familie und landen bei den Eltern oder Großeltern.

Stellen wir uns vor, dass auch beim Weihnachtsmann Fachkräftemangel herrscht. Er beschließt daher durch Digitalisierung seine "Prozesse" zu optimieren. Weihnachtswünsche können von nun an digital verschickt werden. Um dies zu simulieren, erstellen wir einen kleinen Datensatz (wir nutzen die Console der Developer Tools):

PUT x-mas-wishes/_bulk
{"index": {}}
{"name": "Sebastian", "wish": "Eisenbahn", "rating": 5, "date": "2019-12-01T10:00:00Z", "age": 8}
{"index": {}}
{"name": "Ella", "wish": "blaues Auto", "rating": 3, "date": "2019-12-01T14:54:00Z", "age": 5}
{"index": {}}
{"name": "Moritz", "wish": "Mikroskop", "rating": 2, "date": "2019-12-01T08:44:00Z", "age": 9}
{"index": {}}
{"name": "Sebastian", "wish": "Fahrrad", "rating": 1, "date": "2019-12-02T12:00:00Z", "age": 8}
{"index": {}}
{"name": "Lorenz", "wish": "Fahrrad", "rating": 1, "date": "2019-12-02T12:00:00Z", "age": 8}
{"index": {}}
{"name": "Susann", "wish": "Puppe", "rating": 4, "date": "2019-12-02T11:30:00Z", "age": 41}
{"index": {}}
{"name": "Imai", "wish": "Fahrrad", "rating": 5, "date": "2019-12-03T06:32:00Z", "age": 9}
{"index": {}}
{"name": "Sebastian", "wish": "Fahrrad", "rating": 4, "date": "2019-12-03T12:30:00Z", "age": 8}
{"index": {}}
{"name": "Melissa", "wish": "Puzzle", "rating": 2, "date": "2019-12-03T14:00:00Z", "age": 7}
{"index": {}}
{"name": "Jonathan", "wish": "Katze", "rating": 5, "date": "2019-12-03T15:23:00Z", "age": 4}
{"index": {}}
{"name": "Sebastian", "wish": "Angel", "rating": 2, "date": "2019-12-03T16:00:00Z", "age": 8}

Der Bumerang-Effekt

Leider hat der Weihnachtsmann nicht damit gerechnet, dass die Kinder nun unentwegt ständig neue Wünsche äußern und/oder Ihre Meinung ändern. Welche Eltern kennen das nicht?

Der Weihnachtsmann muss die Kontrolle über die Datenflut zurückerlangen. Zunächst möchte er die Daten zusammenfassen:

  • Was möchte welches Kind?
  • Wann wurde der letzte Wunsch geäußert?
  • Wie wichtig war der wichtigste Wunsch?
  • und, und, und

Aber so wie die einzelnen Wünsche (Dokumente) nun vorliegen, hat es der Weihnachtsmann schwer. Als Weihnachtsmann braucht man nicht nur Überblick über die lokalen Wünsche einzelner, er braucht auch eine globale Sicht für die Herstellung und Beschaffung, aber dazu später.

Transform als Hilfe

Zunächst legt er ein Kibana Index Pattern für den gerade von uns erstellen Index x-mas-wishes an, notwendig um im nächsten Schritt die Transforms UI zu benutzen.

In der Transforms UI erstellt er einen Transform Job in Kibana Management:

Hinweis: Transform (Beta) gibt es seit 7.2, hier noch unter dem Namen Data Frame Transform. Mit 7.5 wurde das Feature umbenannt in kurz Transform. Die Transform UI befindet sich nun in Kibana Management, zuvor unter Machine Learning. Der Weihnachtsmann benutzt bereits 7.5, schließlich ist er immer up-to-date. Wer das Gezeigte nachbauen möchte, kann aber auch eine ältere Version benutzen.

Aber was ist das? Beim genaueren Betrachten der Daten stellt der Weihnachtsmann fest, dass sich ein älteres “Kind” eingeschlichen hat. Er benutzt eine Query als Filter und hat nun folgende Transform Konfiguration erstellt:

Nun noch schnell Name und "Destination" Index:

Nun hat der Weihnachtsmann alle Metriken gesammelt, aber er benötigt noch die Wünsche selbst.

Wünsche zusammenfassen

Dazu kopiert er die erstellte Konfiguration nach dem nächsten Schritt mit “Copy to clipboard”, öffnet die Dev Console und arbeitet weiter:

Hinweis: Es ist auch möglich im Wizard den Advanced pivot editor zu nutzen.

Der Weihnachtsmann möchte alle Wünsche erhalten und so benutzt er die Scripted Metric Aggregation um in jedem transformierten Dokument ein Array mit allen Ursprungsdokumenten zu erstellen:

"all_wishes": {
  "scripted_metric": {
    "init_script": "state.docs = []",
    "map_script": "state.docs.add(new HashMap(params['_source']))",
    "combine_script": "return state.docs",
    "reduce_script": "def docs = []; for (s in states) {for (d in s) { docs.add(d);}}return docs"
  }
}

Damit erhält er am Beispiel von "Sebastian" folgendes:

"all_wishes" : [
  {
    "wish" : "Eisenbahn",
    "date" : "2019-12-01T10:00:00Z",
    "name" : "Sebastian",
    "rating" : 5,
    "age" : 8
  },
  {
    "wish" : "Fahrrad",
    "date" : "2019-12-02T12:00:00Z",
    "name" : "Sebastian",
    "rating" : 1,
    "age" : 8
  },
  {
    "wish" : "Fahrrad",
    "date" : "2019-12-03T12:30:00Z",
    "name" : "Sebastian",
    "rating" : 4,
    "age" : 8
  },        {
    "wish" : "Angel",
    "date" : "2019-12-03T16:00:00Z",
    "name" : "Sebastian",
    "rating" : 2,
    "age" : 8
  }
]

Der zuletzt geäußerte Wunsch

Für den zuletzt geäußerten Wunsch können wir ebenfalls eine Scripted Metric Aggregation verwenden:

"latest_wish": {
  "scripted_metric": {
    "init_script": "state.timestamp_latest = 0L; state.last_wish = ''",
    "map_script": "def current_date = doc['date'].getValue().toInstant().toEpochMilli(); if (current_date > state.timestamp_latest) {state.timestamp_latest = current_date;state.last_wish = params['_source']['wish'];}",
    "combine_script": "return state",
    "reduce_script": "def last_wish = '';def timestamp_latest = 0L; for (s in states) {if (s.timestamp_latest > (timestamp_latest)) {timestamp_latest = s.timestamp_latest; last_wish = s.last_wish;}} return last_wish"
  }
}

Wir sehen, der Weihnachtsmann ist mitten im Skripten. Vielleicht sollte er jetzt noch das rating mit einbeziehen?

Transforms und Aggregations

Da stellt eine seiner schlauen Elfen ihm die Frage, warum er nicht einfach alles mit Aggregationen macht? Er erklärt: Transform erlaubt es ihm die Ergebnisse in einen neuen Index zu schreiben und damit weitere Analysen auf diesen Daten vorzunehmen. Er könnte nun zum Beispiel auf den letzten Wünschen aggregieren statt auf allen, eine Aggregation auf einer Aggregation sozusagen. Der Weihnachtsmann könnte aufgrund der Verwendung eines neuen Indexes zusätzlich Outlier Detection ausprobieren.

Immer auf dem Laufenden mit Continuous Transform

Zurück zu unserem Transform Job: Wir alle wissen, wie stressig die Zeit vor Weihnachten sein kann. Der Weihnachtsmann muss ständig auf neue Wünsche reagieren, ständig seine Produktion/Beschaffung umstellen. Er möchte also nicht nur einmalig die Daten transformieren, sondern immer einen aktuellen Blick auf die Wünsche haben. Er macht aus dem batch transform dazu ein continuous:

Mit dieser Konfiguration kann der Transform Job nach Änderungen schauen und den Destination Index updaten.

Transform starten

Fertig, abschicken und starten:

POST _transform/x-mas-wishes-2019/_start

Hinweis: Jobs lassen sich ebenfalls in der UI bedienen, mit vielen nützlichen Informationen.

Ende

Der Weihnachtsmann ist glücklich, nun hat er alle Daten immer auf einen Blick. Mit Transform wandelt er die einzelnen hereinkommenden Wünsche (Events) zusammen (Sessions) und kann weitere Analysen auf diesen Daten durchführen.

Transform ermöglicht eine Vielzahl von Anwendungsmöglichkeiten und wir konnten hier nicht auf alle Konfigurationsmöglichkeiten eingehen. Es lohnt ein Blick in die Dokumentation.

4 Likes