8 min read

Häufige Fehler bei der Migration von HiveQL zu BigQuery: Eine detaillierte Untersuchung - Teil 2

Published on
March 19, 2024
Author
Steve Ahlswede
Steve Ahlswede
Data Engineer
Subscribe to our newsletter
Subscribe
Häufige Fehler bei der Migration von HiveQL zu BigQuery: Eine detaillierte Untersuchung - Teil 2

Im letzten Beitrag haben wir vier häufige Fehler behandelt, mit denen wir bei der Migration von HiveQL zu BigQuery während einer Data Warehouse-Migration zu kämpfen hatten. Dabei ging es um Ranking-Probleme, Probleme bei der Verwendung der `TRIM`-Funktion, die Größe von `NULL`-Arrays und Probleme mit der Gregorianischen Kalenderreform. In diesem Beitrag werden wir mit einigen weiteren Beispielen fortfahren. 

Arrays in Gruppierung nach verwenden

In Hive ist es möglich, ein Array in einer `GROUP BY`-Anweisung zu verwenden. 

In BigQuery ist dies jedoch nicht möglich. Daher ist ein Workaround erforderlich. Eine Lösung besteht darin, das Array in einen JSON-String umzuwandeln, da Strings in `GROUP BY` verwendet werden können. Sie können dies in eine CTE- oder Subquery-Abfrage verpacken und den JSON-String anschließend wieder in das ursprüngliche Array konvertieren

Verwendung von Aggregationsfunktionen auf STRUCT/RECORD

In Hive ist es möglich, eine Funktion wie `MIN` ODER `MAX` auf einen STRUCT anzuwenden. Wenn wir `MIN` als Beispiel verwenden, dann wird der minimale STRUCT auf der Grundlage der Werte der Unterfelder bestimmt, wobei das erste Unterfeld Vorrang hat. Wenn wir also zwei STRUCTs wie folgt haben:

Dann würde die `MIN` der beiden zurückgegeben

Denn `abe` < `barry`. Wenn wir nun die Daten so ändern, dass das erste Feld ein Unentschieden hat

Dann würde das `MIN` zurückgeben;

Dies liegt daran, dass das erste Feld nicht ausreicht, um das Minimum zu bestimmen, und daher das zweite Feld verwendet wird.

BigQuery lässt jedoch nicht zu, dass STRUCT-Felder in Aggregationsfunktionen verwendet werden, so dass eine Umgehung erforderlich ist. Eine mögliche Lösung besteht darin, dieselbe Rangordnungslogik mit der Funktion "ROW_NUMBER()" anzuwenden.

Daraus ergibt sich das folgende Ergebnis

Wiederholung von MONTHS_BETWEEN in BigQuery

In Hive gibt es eine Funktion namens `MONTHS_BETWEEN`. Diese Funktion berechnet einen Fließkommawert für die Anzahl der Monate zwischen zwei Daten. Wenn zum Beispiel zwei Daten genau einen halben Monat auseinander liegen, gibt sie den Wert "0,5" zurück. In BigQuery gibt es keine solche Funktion, da die nächstgelegene Option `DATE_DIFF` ist, die den Unterschied in den Monaten als Ganzzahl behandelt, und somit, wenn ein Datum innerhalb eines anderen Monats als das ursprüngliche Datum liegt, auch wenn es nur 2 Tage auseinander liegt (z.B. `2024-10-30` und `2024-11-1`). Um das ursprüngliche Verhalten zu imitieren, haben wir eine benutzerdefinierte Funktion (UDF) geschrieben.

Schlussfolgerung

Es gibt zwar noch mehr kleine Probleme, auf die wir bei der Migration von HiveQL zu BigQuery gestoßen sind, aber wir können nicht auf jedes einzelne eingehen. Wir hoffen, dass diese Beispiele aus den Teilen eins und zwei ausreichen, um Ihnen eine Vorstellung davon zu geben, welche Arten von Problemen Sie haben könnten und wie Sie sie lösen können. Noch besser wäre es, wenn sie genau die Probleme ansprechen würden, mit denen Sie gerade zu kämpfen haben.

Author
Steve Ahlswede
Data Engineer
Subscribe to our newsletter
Subscribe