O Hologres oferece duas funções JSON para extrair e construir dados JSON: GET_JSON_OBJECT extrai um valor de uma string JSON em um caminho especificado, e ROW_TO_JSON converte uma linha em uma string JSON.
|
Função |
Finalidade |
Entrada |
Saída |
Versão |
|
|
Extrair um valor em um caminho JSON |
String JSON (TEXT), expressão de caminho |
TEXT |
Qualquer (requer a extensão |
|
|
Converter uma linha em uma string JSON |
Um registro (tabela, visualize ou subconsulta) |
String JSON |
Hologres V1.3 e posterior |
GET_JSON_OBJECT
A função GET_JSON_OBJECT extrai um objeto JSON ou um valor escalar de uma string JSON usando uma expressão de caminho.
Pré-requisitos
Antes de usar GET_JSON_OBJECT, crie a extensão hive_compatible no seu schema. Para mais informações, consulte Extensões.
CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA <schema_name>;
Sintaxe
SELECT get_json_object(json_string, path);
Parâmetros
|
Parâmetro |
Tipo |
Descrição |
|
|
TEXT |
Uma string JSON válida. |
|
|
TEXT |
Expressão de caminho que identifica o valor a extrair. Consulte Sintaxe de expressão de caminho. |
Valor de retorno: O valor extraído como TEXT. Retorna NULL se o caminho não existir no JSON ou se a string JSON for inválida.
Sintaxe de expressão de caminho
Uma expressão de caminho começa com $, que representa uma variável JSON. Use os operadores abaixo para navegar pela estrutura JSON:
|
Operador |
Descrição |
Exemplo |
|
|
Acessa um campo de objeto pela chave |
|
|
|
Acessa um elemento de array por índice baseado em zero |
|
A indexação de arrays é baseada em zero.$.items[0]retorna o primeiro elemento, e$.items[1]retorna o segundo.
Exemplos
Configure os dados de exemplo:
-- Create the extension in pg_catalog so all users can access it.
CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA pg_catalog;
-- Create and populate the sample table.
BEGIN;
CREATE TABLE hive_json_example (
col_json text
);
COMMIT;
INSERT INTO hive_json_example VALUES
('{"store":{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}},"email":"amy@only_for_json_udf_test.net","owner":"amy"}');
Extrair um campo de nível superior — obtenha o valor de $.owner:
-- Returns: amy
SELECT get_json_object(col_json, '$.owner')
FROM hive_json_example;
Navegar por objetos aninhados — obtenha o preço da bicicleta em $.store.bicycle.price:
-- Returns: 19.95
SELECT get_json_object(col_json, '$.store.bicycle.price')
FROM hive_json_example;
Acessar um elemento de array por índice — obtenha o primeiro item em $.store.fruit[0]:
-- Returns: {"weight":8,"type":"apple"}
SELECT get_json_object(col_json, '$.store.fruit[0]')
FROM hive_json_example;
Chave inexistente — retorna NULL quando o caminho não existe:
-- Returns: NULL
SELECT get_json_object(col_json, '$.no_key')
FROM hive_json_example;
ROW_TO_JSON
A função ROW_TO_JSON converte uma linha em uma string JSON e aceita até 50 colunas.
A função ROW_TO_JSON está disponível no Hologres V1.3 e versões posteriores. Para atualizar, atualize sua instância ou entre em contato com o suporte pelo grupo do DingTalk do Hologres .
Sintaxe
SELECT ROW_TO_JSON(record);
Parâmetros
|
Parâmetro |
Descrição |
|
|
Um valor do tipo linha: nome de tabela, nome de visualize ou resultado de subconsulta. |
Valor de retorno: Uma string JSON em que cada chave corresponde a uma coluna do registro.
A nomenclatura das chaves depende da versão do Hologres:
Antes da V1.3.52 : As chaves são posicionais —f1,f2, e assim por diante.
V1.3.52 e posterior : As chaves baseiam-se nos nomes das colunas.
Exemplos
Configure os dados de exemplo:
CREATE TABLE interests_test (
name text,
intrests text
);
INSERT INTO interests_test VALUES
('Ava', 'singing, dancing'),
('Bob', 'playing football, running, painting'),
('Jack', 'arranging flowers, writing calligraphy, playing the piano, sleeping');
Converta cada linha em uma string JSON:
SELECT ROW_TO_JSON(t)
FROM (
SELECT name, intrests
FROM interests_test
) AS t;
No Hologres V1.3.52 e posterior, as chaves usam os nomes das colunas:
row_to_json
------------------------------
"{"name": "Jack", "interests": "arranging flowers, writing calligraphy, playing the piano, sleeping"}"
"{"name": "Ava", "interests": "singing, dancing"}"
"{"name": "Bob", "interests": "playing football, running, painting"}"
Nas versões do Hologres anteriores à V1.3.52, as chaves usam nomes posicionais:
row_to_json
------------------------------
{"f1":"Ava","f2":"singing, dancing"}
{"f1":"Bob","f2":"playing football, running, painting"}
{"f1":"Jack","f2":"arranging flowers, writing calligraphy, playing the piano, sleeping"}
Solução de problemas
ERROR: function get_json_object (text, unknown) does not exist
Causa 1 — Permissão de schema ausente
No modelo de permissão no nível de schema (SLPM), o usuário RAM não tem permissão para consultar o schema onde a extensão foi criada (por exemplo, o schema public).
Para corrigir, use uma das opções a seguir:
Conceda ao usuário RAM permissão para consultar esse schema.
-
Recrie a extensão em
pg_catalog, acessível por padrão a todos os usuários:DROP EXTENSION hive_compatible; CREATE EXTENSION hive_compatible SCHEMA pg_catalog;
Causa 2 — O primeiro argumento não é TEXT
A função GET_JSON_OBJECT exige que o primeiro argumento seja do tipo TEXT. Se a coluna tiver outro tipo de dados, converta-o para TEXT:
SELECT get_json_object(col::text, '$.key') FROM your_table;
ERROR: get_json_object for fe, should not be evaluated
Causa 1 — O primeiro argumento é uma constante
A função GET_JSON_OBJECT não aceita uma constante de string como primeiro argumento. Em vez disso, passe uma referência de coluna de tabela:
-- Correct: pass a column reference
SELECT get_json_object(col_json, '$.key') FROM your_table;
Causa 2 — O primeiro argumento contém NULL
Filtre as linhas em que a coluna é NULL antes de chamar a função:
SELECT get_json_object(col_json, '$.key')
FROM your_table
WHERE col_json IS NOT NULL;