Práticas recomendadas de leitura de dados JSON - Amazon Athena

Práticas recomendadas de leitura de dados JSON

JavaScript Object Notation (JSON) é um método comum para codificar estruturas de dados como texto. Muitos aplicativos e ferramentas produzem dados codificados em JSON.

No Amazon Athena, você pode criar tabelas com base em dados externos e incluir dados codificados em JSON nelas. Para esses tipos de dados de origem, use o Athena junto com Bibliotecas SerDe JSON.

Use as seguintes dicas para ler dados codificados por JSON:

  • Escolha o SerDe certo: um JSON SerDe nativo, org.apache.hive.hcatalog.data.JsonSerDe; ou um OpenX SerDe, org.openx.data.jsonserde.JsonSerDe. Para ter mais informações, consulte Bibliotecas SerDe JSON.

  • Certifique-se de que cada registro codificado em JSON seja representado em uma linha separada, não formatado para impressão.

    nota

    O SerDe espera que cada documento JSON esteja em uma única linha de texto, sem caracteres de terminação de linha separando os campos no registro. Se o texto JSON estiver formatado para impressão, você poderá receber uma mensagem de erro como HIVE_CURSOR_ERROR: Row is not a valid JSON Object (HIVE_CURSOR_ERROR: a linha não é um objeto JSON válido) ou HIVE_CURSOR_ERROR: JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (HIVE_CURSOR_ERROR: JSONParseException: Fim de entrada inesperado: marcador de fechamento esperado para OBJECT) quando tentar consultar a tabela após criá-la. Para obter mais informações, consulte JSON Data Files na documentação do OpenX SerDe no GitHub.

  • Gere seus dados codificados por JSON em colunas sem distinção entre letras maiúsculas e minúsculas.

  • Forneça uma opção para ignorar registros malformadas, como neste exemplo.

    CREATE EXTERNAL TABLE json_table ( column_a string, column_b int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true') LOCATION 's3://DOC-EXAMPLE-BUCKET/path/';
  • Converta os campos nos dados de origem que tenham um esquema indeterminado em strings codificadas em JSON no Athena.

Ao criar tabelas com os dados do JSON, o Athena analisa os dados com base no esquema existente e predefinido. No entanto, nem todos os dados podem ter um esquema predefinido. Para simplificar o gerenciamento de esquemas nesses casos, costuma ser útil converter os campos nos dados de origem que têm um esquema indeterminado em strings JSON no Athena e usar Bibliotecas SerDe JSON.

Por exemplo, considere um aplicativo IoT que publique eventos com campos comuns de sensores diferentes. Um desses campos deve armazenar uma carga útil personalizada que seja exclusiva do sensor que envia o evento. Nesse caso, como você não sabe o esquema, recomendamos armazenar as informações como uma string codificada em JSON. Para isso, converta os dados na tabela do Athena em JSON, como no exemplo a seguir. Você também pode converter os dados codificados em JSON em tipos de dados do Athena.

Converter tipos de dados do Athena em JSON

Para converter os tipos de dados do Athena em JSON, use CAST.

WITH dataset AS ( SELECT CAST('HELLO ATHENA' AS JSON) AS hello_msg, CAST(12345 AS JSON) AS some_int, CAST(MAP(ARRAY['a', 'b'], ARRAY[1,2]) AS JSON) AS some_map ) SELECT * FROM dataset

Essa consulta retorna:

+-------------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------------+ | "HELLO ATHENA" | 12345 | {"a":1,"b":2} | +-------------------------------------------+

Converter JSON em tipos de dados do Athena

Para converter os dados do JSON em tipos de dados do Athena, use CAST.

nota

Neste exemplo, para denotar strings como codificadas em JSON, comece com a palavra-chave JSON e use aspas simples, como JSON '12345'

WITH dataset AS ( SELECT CAST(JSON '"HELLO ATHENA"' AS VARCHAR) AS hello_msg, CAST(JSON '12345' AS INTEGER) AS some_int, CAST(JSON '{"a":1,"b":2}' AS MAP(VARCHAR, INTEGER)) AS some_map ) SELECT * FROM dataset

Essa consulta retorna:

+-------------------------------------+ | hello_msg | some_int | some_map | +-------------------------------------+ | HELLO ATHENA | 12345 | {a:1,b:2} | +-------------------------------------+