Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Transformer les réponses JSON de l'API BigQuery par récursion

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et 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

Construire des paires clé-valeur à partir d'imbrications de lignes field/value

1 vnu9dfxo8kvsal2frcxeegLa Sagrada Familia, Barcelone, par Paolo Nicolello.

Répétez après moi : le JSON imbriqué, quel casse-tête à manipuler ! J'ai raison, n'est-ce pas ? Évidemment ! Cela étant dit, sachez que je suis un fervent défenseur du JSON. C'est logique, universel, et la plupart des langages s'en servent pour créer des structures de données de type hash-map à accès rapide. Tout le monde y gagne !

Jusqu'au moment où on l'imbrique.

Entrent alors en scène une horde d'adeptes des vertus du JSON imbriqué, face à ceux qui voient dans le JSON aplati le calice ultime de la béatitude pour les payloads d'API. Cette bataille silencieuse est si féroce que d'innombrables techniques d'aplatissement peuplent les dépôts des hackers, avec des méthodes comme la voie récursive et la voie non récursive.


Quitter le nid, par récursion

Vous avez vu le film Inception ? Un petit bijou. Une trame temporelle dans une trame temporelle dans une trame temporelle. Et quand tout se déroule à rebours, on comprend comment les pièces s'emboîtent. La récursion fonctionne de la même manière : très peu de code, mais elle s'attaque à une complexité computationnelle (autrement dit imbriquée) considérable.

Bon, assez bavardé, passons aux choses sérieuses !

L'API de requête de BigQuery renvoie du JSON

Voici un exemple de réponse de l'API Google BigQuery après l'exécution d'une requête :

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

Le schéma indique la structure des données et les lignes précisent, avec f pour field et v pour value, quelles valeurs viennent s'inscrire dans le schéma.

N'est-il pas plus simple de lire et de manipuler le JSON quand il ressemble à ceci ?

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

Si vous en convenez, vous êtes entre de bonnes mains.

La solution

Voici le code node.js qui effectue cette transformation. Utilisez-le, adaptez-le à vos besoins et, plus largement, simplifiez-vous la vie tout en faisant le bonheur de vos données. L'interface de la fonction est la suivante :

convertBQToMySQLResults(schema, rows)

et vous lui transmettez les résultats BigQuery ainsi :

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

Une démo JsFiddle

Voici une démo JsFiddle du code, à manipuler à votre guise :

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

En résumé

Il existe une multitude de transformations pour le JSON. Les solutions récursives ne sont pas les plus simples à déboguer, mais elles offrent l'empreinte de code la plus concise. Pour observer ces algorithmes au ralenti, rien ne vaut un pas-à-pas dans le code avec un débogueur. Cet article propose une façon d'aplatir un JSON imbriqué et complexe issu de Google BigQuery pour en faire quelque chose de manipulable à votre convenance. À vous de jouer ! Bonne conversion !