8 min read

So migrieren Sie Hive UDFs, UDTFs und UDAFs zu BigQuery

Published on
January 11, 2024
Author
Csaba Kassai
Csaba Kassai
Head of Data
Subscribe to our newsletter
Subscribe
So migrieren Sie Hive UDFs, UDTFs und UDAFs zu BigQuery

Eine der ersten Aufgaben bei einem Migrationsprojekt von Hive zu BigQuery Data Warehouse ist die Übertragung der benutzerdefinierten Funktionen von Hive, einschließlich UDFs (User-Defined Functions), UDTFs (User-Defined Table-Generating Functions) und UDAFs (User-Defined Aggregate Functions) auf die BigQuery-Seite. Da es in diesem Bereich erhebliche Unterschiede zwischen Hive und BigQuery gibt, ist dieser Migrationsschritt alles andere als trivial.

In diesem Beitrag stelle ich bewährte Strategien und Best Practices für diesen wichtigen Prozess vor.

Was sind UDFs, UDAFs und UDTFs in Hive?

Apache Hive erweitert seine Abfragemöglichkeiten mit benutzerdefinierten Funktionen. Diese Funktionen ermöglichen es Ihnen, die Standardfunktionalität von Hive zu erweitern, um spezifische, benutzerdefinierte Datenverarbeitungsanforderungen zu erfüllen. In Hive werden diese benutzerdefinierten Funktionen in der Regel in Java geschrieben, indem bestimmte Schnittstellen und abstrakte Klassen implementiert werden.

Das Hauptunterscheidungsmerkmal zwischen diesen Funktionen ist die Kardinalität der Eingabe- und Ausgabezeilen.

Pro Cons Example
UDF 1 row
1 row
A UDF that takes a timestamp column and extracts the hour component or a UDF that converts text to uppercase.
UDAF
multiple rows
1 row
A function that calculates the median of a set of numerical values or a custom aggregation that combines various columns into a single weighted score.
UDTP
1 row
multiple rows
A function that takes a column containing comma-separated values and splits it into multiple rows, one for each value.

Was kann BigQuery bieten, um benutzerdefinierte Funktionen hinzuzufügen?

UDFs

Wenn wir über UDFs sprechen, bietet Google BigQuery eine vielseitige und leistungsstarke Plattform für das Hinzufügen benutzerdefinierter Funktionen und die Anpassung an verschiedene Datenverarbeitungsanforderungen. Im Gegensatz zu Hive, wo benutzerdefinierte Funktionen überwiegend Java-basiert sind, bietet BigQuery drei primäre Möglichkeiten zur Erweiterung seiner Fähigkeiten:

Pro Cons
SQL UDFs
  • It is SQL: no other programming language knowledge is needed for implementation and maintenance

  • Usually, it is the most performant and the most cost-effective option

  • It is SQL: it is not easy or possible to implement complex logic

JavaScript UDFs
  • It is JS: It provides the flexibility of JS, allows the implementation of complex logic

  • BigQuery native: no external component is needed to execute the function. Everything is managed by BQ.

  • The performance and speed is weaker than the SQL UDFs

  • It is JS: you will need JS knowledge for implementation and maintenance

Remote Functions
  • Flexibility: you can implement the function using any language that is supported by Cloud Run or Cloud Functions

  • Standard maintenance: your function is a REST API backed up by a microservice. You can test, do CI/CD, etc… as you would normally do with a normal microservice

  • ARRAY, STRUCT, INTERVAL, and GEOGRAPHY types are not supported out of the box

  • One more moving part: you need to add Cloud Functions or Cloud Run to your architecture with everything that this brings

  • Extra cost: you will need to pay the extra cost of Cloud Run or Cloud Functions

Mit dem richtigen Setup können alle diese Optionen nahtlos von SQL aus verwendet werden, so wie Sie eine native BQ-Funktion verwenden würden.

UDAFs und UDTFs

Zum Zeitpunkt der Erstellung dieses Blogbeitrags bietet BigQuery keine Möglichkeit, benutzerdefinierte UDAFs oder UDTFs zu implementieren. Wenn Sie also einige dieser benutzerdefinierten Funktionen auf der Hive-Seite haben, müssen Sie ein wenig kreativ sein, um sie zu ersetzen.

Welche Option soll verwendet werden?

Bei unseren Migrationsprojekten dient der unten stehende Entscheidungsbaum als Leitfaden, um den am besten geeigneten Weg für die Migration von Hive UDFs zu BigQuery zu ermitteln, wobei die Fähigkeiten und Einschränkungen von BigQuery im Vergleich zu den benutzerdefinierten Funktionen von Hive berücksichtigt werden. Das Ziel ist es, sicherzustellen, dass alle notwendigen Transformationen und Berechnungen, die von den ursprünglichen Hive UDFs durchgeführt werden, in der neuen BigQuery-Umgebung erhalten bleiben und optimiert werden.

Die Reise beginnt mit der grundlegenden Frage, ob die UDF im neuen BigQuery Data Warehouse benötigt wird. Während der Bewertung prüfen wir, ob die Funktion in einer Transformation verwendet wird, die auf die BQ-Seite migriert werden soll.  Ist dies nicht der Fall, erhalten wir eine einfache Lösung: Es ist keine Migration erforderlich, und wir können uns mit der Einfachheit dieses Ergebnisses trösten. Wenn die UDF jedoch tatsächlich benötigt wird, erkunden wir als Nächstes die native Funktionsbibliothek von BigQuery, um zu sehen, ob es eine vorhandene Funktion gibt, die die Fähigkeiten unserer Hive-UDF replizieren kann. Wenn eine native BigQuery-Funktion verfügbar ist, übernehmen wir sie und nutzen die in BigQuery integrierte Effizienz.

In Fällen, in denen BigQuery keine native Alternative anbietet, untersuchen wir die Art der Funktion, mit der wir es zu tun haben. Bei einer Standard-UDF prüfen wir, ob eine Neuimplementierung in BigQuery SQL möglich ist; wenn ja, fahren wir mit diesem SQL-zentrierten Ansatz fort. Wenn nicht, wenden wir uns den serverlosen Lösungen von Google Cloud zu und nutzen die Funktion BQ Remote UDFs. Diese Option ist attraktiv, da wir Java verwenden und den Kernfunktionscode unverändert lassen können. Sollten Remote-Funktionen in unserem Fall aus irgendeinem Grund nicht verfügbar sein, können wir jederzeit auf JS UDFs zurückgreifen.

Bei UDAFs hängt die Entscheidung von der Datenmenge ab, insbesondere davon, ob die Aggregation innerhalb eines begrenzten Bereichs erfolgt. Für überschaubare Datengruppierungen können wir mit der ARRAY_AGG-Funktion von BigQuery benutzerdefinierte Aggregationen erstellen. Bei unhandlicheren Aggregationen müssen wir unseren Ansatz möglicherweise komplett umgestalten oder die Verarbeitung auf Google Cloud Dataflow oder Dataproc verlagern, um Skalierbarkeit und Leistung zu gewährleisten.

Wenn wir bei UDTFs im Bereich von SQL bleiben möchten, ist der Weg einfach: Wir wandeln die Funktion um, um Elemente als Array zu generieren, und verwenden die UNNEST-Funktion von BigQuery, um die Arrays in mehrere Zeilen zu zerlegen. Wenn dieser Ansatz nicht funktioniert, können wir jederzeit auf Cloud Dataflow oder Dataproc zurückgreifen, um unsere Funktionalität zu implementieren.

Dieser Entscheidungsbaum hilft nicht nur bei der methodischen Migration der benutzerdefinierten Funktionen von Hive zu BigQuery, sondern stellt auch sicher, dass jeder Schritt mit den optimalen Praktiken und der Architektur von BigQuery übereinstimmt, um einen reibungslosen und effizienten Übergang zu gewährleisten.

Abschluß

Das war's mit unserem Leitfaden zum Übertragen der benutzerdefinierten Funktionen von Hive auf BigQuery. Es ist nicht gerade ein Spaziergang, aber mit der Roadmap, die wir erstellt haben, ist es definitiv machbar. Betrachten Sie den Entscheidungsbaum als Ihr zuverlässiges GPS, das Ihnen hilft, sich bei der Migration zurechtzufinden, ohne sich zu verirren.

In den kommenden Beiträgen werde ich echte Migrationsgeschichten aufschlüsseln - keine Floskeln, nur die direkte Information darüber, wie diese Tools in der Praxis funktionieren. Wir werden über die Erfolge, die Fehlschläge und die Hacks berichten, die jede Migration zu einem Gewinn gemacht haben.

Wenn Sie sich also auf den großen Wechsel zu BigQuery vorbereiten, bleiben Sie am Ball. Wir haben die Insider-Tipps, die Ihnen helfen werden, die Komplexität zu durchbrechen und das Beste aus dem Kraftpaket von Google Cloud herauszuholen.

Wir sehen uns im nächsten Beitrag, in dem wir mit echter Migrationsmagie auf den Punkt kommen.

Author
Csaba Kassai
Head of Data
Subscribe to our newsletter
Subscribe