O Apache Hop não possui processamento json rico, então estou enviando os dados para o postgres para fazer o trabalho
Com um blob de json profundamente aninhado (exemplo de subconjunto abaixo), como posso nivelar e armazenar o resultado? Vou recuperá-lo com Hop e continuar o processamento. A saída final é csv.
Algo como
atualizar um conjunto de tabelas flat_json = flatten(nested_json) onde id = 1;
Esse recorte de jq faz isso, qual é o equivalente em pg?
echo '[{"value": {
"id":"1",
"desc":"widget",
"colours":[{
"hue":"red",
"tint":"light"
},{
"hue":"green",
"tint":"light"
},{
"hue":"blue",
"tint":"dark"
}],
"isActive":true
}}]' | jq '[.[] |
[leaf_paths as $path | {"key": $path | join("_"), "value": getpath($path)}]
| from_entries]
'
result
[
{
"value_id": "1",
"value_desc": "widget",
"value_colours_0_hue": "red",
"value_colours_0_tint": "light",
"value_colours_1_hue": "green",
"value_colours_1_tint": "light",
"value_colours_2_hue": "blue",
"value_colours_2_tint": "dark",
"value_isActive": true
}
]
Se esta é uma ideia deselegante, existe uma maneira concisa de enviar o json para colunas criadas automaticamente? (existem cerca de 200) Ou enviar o json aninhado para uma coleção de tabelas (widgets, cores, mais) vinculadas por chaves estrangeiras geradas automaticamente? Os dados reais possuem um aninhamento mais profundo do que o exemplo mostrado.
Quanto ao equivalente do PG, é este SQL:
O SQL acima deve funcionar para um JSON arbitrário e, neste caso, retorna o seguinte:
O SQL recursivo é necessário porque os objetos e matrizes JSON precisam ser descompactados recursivamente. Como a referência recursiva a
json_tree
não pode aparecer duas vezes na consulta, recorremos a alguns truques nesta etapa, com duas junções à esquerda (das quais apenas uma corresponderá a uma determinada linha) ecase ... when
para garantirjson_each()
ejson_array_elements()
não receber tipos de parâmetros incompatíveis , o que resultaria em um erro. (Isso não é muito elegante, estou me perguntando se existe uma maneira melhor de fazer isso.)O SQL construirá um caminho JSON como um array e,
array_to_string()
finalmente, produziremos um nome de quase coluna. (Estou omitindo o primeiro elemento do caminho dividindo a matriz comjson_path[2:]
, porque o elemento de nível superior no exemplo JSON é uma matriz, portanto, estritamente falando, as chaves de caminho corretas seriam0_value_id
,0_value_desc
, etc.)Todos os caminhos JSON são produzidos, mas estamos interessados apenas em nós folha e - como sabemos que matrizes e objetos não podem ser nós folha - precisamos excluí-los no final.
Quanto à segunda pergunta - ou seja, se bem entendi, esta é a melhor maneira de propagar dados JSON arbitrários em um esquema de banco de dados (presumivelmente) correspondente - meu palpite quase certamente não é, embora: