Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Trasformare in modo ricorsivo le risposte JSON dell'API di BigQuery

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

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

Come costruire coppie chiave-valore a partire da righe annidate field/value

1 vnu9dfxo8kvsal2frcxeegLa Sagrada Familia, Barcellona, foto di Paolo Nicolello.

Diciamolo insieme: "lavorare con il JSON annidato è una bella gatta da pelare!". Ho ragione? Eccome! Tolto questo dai piedi, lasciatemi dire che credo nel JSON in tutto e per tutto. È logico, è universale e la maggior parte dei linguaggi lo usa per creare strutture dati in stile hash-map ad accesso rapido. Ci guadagnano tutti!

Almeno finché non lo si annida.

Ed è qui che entra in scena un'orda di sostenitori del JSON annidato, contrapposta a chi vede nel JSON appiattito il calice prediletto della beatitudine in fatto di payload API. La battaglia silenziosa è così accesa che le tecniche di flattening abbondano nei repository degli hacker, con metodi come quello ricorsivo e quello non ricorsivo.


Lasciare il nido, in modo ricorsivo

Avete mai visto il film Inception? Un piccolo gioiello. Una linea temporale dentro una linea temporale dentro un'altra linea temporale. E quando il tutto si riavvolge, capite finalmente come ogni pezzo si incastra. Allo stesso modo, la ricorsione occupa pochissime righe di codice ma sa affrontare una complessità computazionale (leggi: "annidata") enorme.

Bando alle ciance, mettiamoci all'opera!

L'API di query di BigQuery restituisce JSON

Ecco un esempio di risposta dell'API di Google BigQuery dopo l'esecuzione di una query:

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

Lo schema mostra come sono strutturati i dati, mentre le righe indicano — con "f" per field e "v" per value — quali valori si inseriscono nello schema.

Non è molto più semplice leggere e manipolare il JSON quando si presenta così?

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

Se siete d'accordo, allora siete nel posto giusto.

La soluzione

Ecco il codice node.js che esegue questa trasformazione. Usatelo pure, adattatelo alle vostre esigenze e in generale rendete più semplice la vostra vita (e più felici i vostri dati). L'interfaccia della funzione è la seguente:

convertBQToMySQLResults(schema, rows)

e i risultati di BigQuery si passano in questo modo:

// 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.

Una demo su JsFiddle

Qui trovate una demo del codice su JsFiddle con cui sperimentare:

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

In sintesi

Di trasformazioni per il JSON in giro ce ne sono moltissime. Le soluzioni ricorsive non sono certo le più facili da debuggare, ma sono quelle con il footprint di codice più snello. Procedere passo passo con un debugger è il modo migliore per osservare questi algoritmi al "rallentatore". Questo articolo propone un approccio per appiattire JSON annidati complessi provenienti da Google BigQuery e trasformarli in qualcosa di facilmente manipolabile e riutilizzabile a piacimento. Provatelo! Buona conversione!