Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Transformando respostas JSON da API do BigQuery recursivamente

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

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

Construindo pares chave-valor a partir de aninhamentos de linhas field/value

1 vnu9dfxo8kvsal2frcxeegLa Sagrada Familia, Barcelona, por Paolo Nicolello.

Repita comigo: "trabalhar com JSON aninhado é complicado!". Concorda? Com certeza! Agora que tiramos isso do caminho, vou logo dizendo: sou fã de JSON de cabo a rabo. É lógico, é universal e a maioria das linguagens usa o formato para criar estruturas de dados estilo hash-map com acesso rápido. Todo mundo sai ganhando!

Até você começar a aninhar.

Aí entra em cena uma horda de defensores dos benefícios do JSON aninhado, contra os que veem no JSON achatado o cálice sagrado do payload de API. A batalha silenciosa é tão acirrada que técnicas de achatamento se espalham pelos repositórios de hackers de plantão, com métodos como o caminho recursivo e o caminho não recursivo.


Saindo do ninho, recursivamente

Já viu o filme A Origem? É bom demais. Uma linha do tempo dentro de outra linha do tempo dentro de outra linha do tempo. E, quando tudo volta ao começo, você entende como as peças se encaixam. Do mesmo jeito, a recursão ocupa pouquíssimo espaço no código, mas dá conta de uma complexidade computacional enorme (leia-se "aninhada").

Beleza, chega de enrolação, vamos ao que interessa!

A API de query do BigQuery retorna JSON

Este é um exemplo da resposta da API do Google BigQuery depois de executar uma query:

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

O schema mostra como os dados estão estruturados e as linhas indicam, com "f" para field e "v" para value, quais valores se encaixam no schema.

E aí, não fica bem mais fácil ler e manipular o JSON quando ele aparece assim?

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

Se você concorda, então está em boas mãos.

A solução

Aqui vai o código em node.js que faz essa transformação. Fique à vontade para usar, adaptar às suas necessidades e, no geral, simplificar a sua vida e deixar os seus dados mais felizes. A interface da função é:

convertBQToMySQLResults(schema, rows)

e você passa os resultados do BigQuery assim:

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

Uma demo no JsFiddle

Aqui vai uma demo no JsFiddle para você brincar com o código:

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

Resumindo

Existem várias transformações para JSON por aí. Soluções recursivas não são as mais fáceis de depurar, mas têm o menor footprint de código. Percorrer o código com um debugger é a melhor forma de observar esse tipo de algoritmo em "câmera lenta". Este artigo apresenta uma maneira de achatar aquele JSON aninhado complicado vindo do Google BigQuery e transformá-lo em algo que você consegue manipular e usar do seu jeito. Experimente! Boas conversões!