Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

BigQuery-JSON-API-Antworten rekursiv umwandeln

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

Mar 25, 20192 min read
Eben Du Toit

About Eben Du Toit

I lead engineering teams in the Partner Channel space, building the tooling that helps customers make sense of their revenue — turning complex partner and billing data into something they can actually see, trust, and act on. The work sits at the intersection of cloud cost management, FinOps, and billing integrations, with data flowing across GCP, BigQuery, MongoDB Atlas, Snowflake, and the wider cloud ecosystem. It's technically meaty, and I love that about it.

My days are split between people and systems — growing and aligning multiple teams, helping the team navigate the environment, hiring, and partnering with stakeholders across the org. I shift between maker mode and manager mode depending on what's needed: sometimes I'm deep in the code building features, sometimes I'm in the room helping my teams move forward. I care a lot about building teams where good engineers can do their best work.

What I work on

Partner Channel engineering and revenue management tooling · Cloud cost management and FinOps · Billing data pipelines and integrations · Engineering leadership, hiring, and team process

Good topics to find me for

Anything Partner Channel, revenue, FinOps, or billing-related · Data engineering and pipeline architecture · Engineering management, hiring, or team culture

Outside work

When I'm not in a terminal, I'm usually behind a camera — shooting on a Nikon Z or whatever vintage film body I'm currently infatuated with. I follow mountain biking and trail running closely, have strong opinions about mechanical keyboards and good stationery, and watch more anime than I probably admit. I also play Rocket League with more optimism than results.

Cape Town · SAST (UTC+2)

My personal page

1 vnu9dfxo8kvsal2frcxeeg

Key-Value-Paare aus verschachtelten Field/Value-Zeilen erzeugen

1 vnu9dfxo8kvsal2frcxeegSagrada Família, Barcelona, von Paolo Nicolello.

Sagen Sie es mit mir: "Nested JSON nervt!". Stimmt's? Definitiv! Damit das gesagt ist: Ich bin durch und durch JSON-Fan. Logisch, universell, und in den meisten Sprachen lassen sich damit blitzschnelle Datenstrukturen im Hash-Map-Stil aufbauen. Ein Gewinn für alle!

Bis man es verschachtelt.

Dann betritt eine ganze Schar die Bühne: die einen schwören auf die Vorzüge verschachtelter JSON-Strukturen, die anderen sehen in flachem JSON den heiligen Gral jeder API-Payload. Dieser stille Glaubenskrieg tobt so heftig, dass unzählige Flattening-Techniken in den Repos zahlloser Hacker schlummern – etwa der rekursive Weg und der nicht-rekursive Weg.


Rekursiv aus dem Nest

Haben Sie schon mal Inception gesehen? Großes Kino. Eine Zeitebene in einer Zeitebene in einer Zeitebene. Und am Ende, wenn sich alles zurückrollt, fügt sich plötzlich alles zusammen. Mit Rekursion ist es ähnlich: Sie braucht im Code kaum Platz, bewältigt aber enorm komplexe (sprich: "verschachtelte") Berechnungen.

Okay, genug Vorgeplänkel – ran ans Werk!

Die Query-API von BigQuery liefert JSON

Hier ein Beispiel für die API-Antwort von Google BigQuery nach einer Query:

https://gist.github.com/ebendutoit/b160b66f3ba4073686d277524d210b90

Das Schema zeigt Ihnen, wie die Daten aufgebaut sind. Die Zeilen geben mit "f" für Field und "v" für Value an, welche Werte ins Schema gehören.

Lässt sich das JSON nicht deutlich angenehmer lesen und bearbeiten, wenn es so aussieht?

https://gist.github.com/ebendutoit/07832a24d9cedf436cb394b7bc6ea136

Wenn Sie nicken, sind Sie hier genau richtig.

Die Lösung

Hier ist der node.js-Code, der diese Umwandlung erledigt. Nutzen Sie ihn gerne, passen Sie ihn an Ihre Anforderungen an und machen Sie sich – und Ihren Daten – das Leben leichter. Die Funktionsschnittstelle lautet:

convertBQToMySQLResults(schema, rows)

Und so übergeben Sie die BigQuery-Ergebnisse:

// apiResponse is the payload you receive from a BigQuery query API // response
convertBQToMySQLResults(apiResponse.schema.fields, apiResponse.rows)

https://gist.github.com/ebendutoit/1717e5eba2f55ab23544153d2ef098a8


Cloud bill shouldn't be a mystery

One platform for AI and Cloud optimization.

Eine JsFiddle-Demo

Hier eine JsFiddle-Demo des Codes zum Ausprobieren:

[wp-js-fiddle url="https://jsfiddle.net/ebendutoit/4rvgnob2/" style="width:100%; height:400px; border:solid #4173A0 1px;"]

Fazit

Es gibt da draußen zahllose JSON-Transformationen. Rekursive Lösungen sind nicht die dankbarsten Kandidaten zum Debuggen, dafür aber besonders schlank im Code. Am besten geht man solche Algorithmen Schritt für Schritt mit einem Debugger durch – sozusagen in "Zeitlupe". Dieser Artikel zeigt einen Weg, komplex verschachteltes JSON aus Google BigQuery so zu glätten, dass Sie es nach Ihren eigenen Regeln weiterverarbeiten können. Probieren Sie es aus – und viel Spaß beim Umwandeln!