COPY no formato JSON - Amazon Redshift

COPY no formato JSON

A estrutura de dados JSON é composta de um conjunto de objetos ou matrizes. Um objeto JSON começa e termina com chaves e contém uma coleção de pares de nome-valor desordenada. Cada nome e valor são separados por um dois-pontos, e os pares são separados por vírgulas. O nome é uma string entre aspas duplas. As aspas devem ser simples (0x22), e não inclinadas ou "inteligentes".

Uma matriz JSON começa e termina com colchetes e contém uma coleção ordenada de valores separados por vírgulas. Um valor pode ser uma string entre aspas, um número, um verdadeiro ou falso Booliano, um nulo, um objeto JSON ou uma matriz.

Os objetos JSON e as matrizes podem ser aninhados, o que possibilita uma estrutura de dados hierárquica. O exemplo a seguir mostra uma estrutura de dados JSON com dois objetos válidos.

{ "id": 1006410, "title": "Amazon Redshift Database Developer Guide" } { "id": 100540, "name": "Amazon Simple Storage Service User Guide" }

A seguir, os mesmos dados como duas matrizes JSON.

[ 1006410, "Amazon Redshift Database Developer Guide" ] [ 100540, "Amazon Simple Storage Service User Guide" ]

Opções COPY para JSON

Você pode especificar as seguintes opções ao usar COPY com dados de formato JSON:

  • 'auto' — COPY carrega automaticamente campos do arquivo JSON.

  • 'auto ignorecase' — COPY carrega automaticamente campos do arquivo JSON enquanto ignora as maiúsculas e minúsculas de nomes de campo.

  • s3://jsonpaths_file — COPY usa um arquivo JSONPaths para analisar nos dados de origem do JSON. Um arquivo JSONPaths é um arquivo de texto que contém um objeto JSON com o nome "jsonpaths" em par com uma matriz de expressões JSONPath. Se o nome for qualquer string além de "jsonpaths", COPY usará o argumento 'auto', em vez de usar o arquivo JSONPaths.

Para obter exemplos que mostrem como carregar dados usando 'auto', 'auto ignorecase' ou um arquivo JSONPaths e usando objetos JSON ou matrizes, consulte Copiar de exemplos JSON.

Opção JSONPath

Na sintaxe do Amazon Redshift COPY, uma expressão JSONPath especifica o caminho explícito para um único elemento de nome em uma estrutura de dados hierárquica JSON, usando notação de colchetes ou notação de ponto. O Amazon Redshift não dá suporte a elementos JSONPath, como caracteres curinga ou expressões de filtro, que podem ser resolvidos para um caminho ambíguo ou vários elementos de nome. Dessa forma, o Amazon Redshift não pode analisar estruturas de dados complexas de vários níveis.

Este é um exemplo de um arquivo JSONPaths com expressões JSONPath usando a notação de colchetes. O cifrão ($) representa a estrutura no nível da raiz.

{ "jsonpaths": [ "$['id']", "$['store']['book']['title']", "$['location'][0]" ] }

No exemplo anterior, $['location'][0] referencia o primeiro elemento em uma matriz. JSON usa uma indexação de matriz baseada em zero. Os índices de matriz devem ser inteiros positivos (maiores ou iguais a zero).

O exemplo a seguir mostra o caminho JSONPath anterior usando notação de pontos.

{ "jsonpaths": [ "$.id", "$.store.book.title", "$.location[0]" ] }

Você não pode misturar notações de colchetes e pontos na matriz jsonpaths. Os colchetes podem ser usados nas notações de colchetes e de pontos para referenciar um elemento de matriz.

Ao usar uma notação de pontos, as expressões JSONPath não deverão conter os seguintes caracteres:

  • Aspas retas únicas ( ' )

  • Ponto final ou ponto ( . )

  • Colchetes ( [ ] ), a menos que sejam usados para referenciar um elemento de matriz

Se o valor no par de nome-valor referenciado por uma expressão JSONPath for um objeto ou uma matriz, todo o objeto ou matriz será carregado como uma string, incluindo as chaves ou os colchetes. Por exemplo, suponhamos que os dados JSON contenham o objeto a seguir.

{ "id": 0, "guid": "84512477-fa49-456b-b407-581d0d851c3c", "isActive": true, "tags": [ "nisi", "culpa", "ad", "amet", "voluptate", "reprehenderit", "veniam" ], "friends": [ { "id": 0, "name": "Martha Rivera" }, { "id": 1, "name": "Renaldo" } ] }

Em seguida, a expressão JSONPath $['tags'] retorna o valor a seguir.

"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]"

Em seguida, a expressão JSONPath $['friends'][1] retorna o valor a seguir.

"{"id": 1,"name": "Renaldo"}"

Cada expressão JSONPath na matriz jsonpaths corresponde a uma coluna na tabela de destino do Amazon Redshift. A ordem dos elementos de matriz jsonpaths deverá corresponder à ordem das colunas na tabela de destino ou na lista de colunas, se uma lista de colunas for usada.

Para obter exemplos que mostrem como carregar dados usando o argumento 'auto' ou um arquivo JSONPaths, e usando objetos JSON ou matrizes, consulte Copiar de exemplos JSON.

Para obter informações sobre como copiar vários arquivos JSON, consulte Uso de um manifesto para especificar arquivos de dados.

Caracteres de escape em JSON

COPY carrega \n como um caractere de nova linha e \t como um caractere de tabulação. Para carregar uma barra invertida, use uma barra invertida de escape ( \\ ).

Por exemplo, suponhamos que você tenha o JSON a seguir em um arquivo chamado escape.json no bucket s3://amzn-s3-demo-bucket/json/.

{ "backslash": "This is a backslash: \\", "newline": "This sentence\n is on two lines.", "tab": "This sentence \t contains a tab." }

Execute os comandos a seguir para criar a tabela ESCAPES e carregar o JSON.

create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35)); copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as json 'auto';

Consulte a tabela ESCAPES para exibir os resultados.

select * from escapes; backslash | newline | tab ------------------------+-------------------+---------------------------------- This is a backslash: \ | This sentence | This sentence contains a tab. : is on two lines. (1 row)

Perda de precisão numérica

É possível perder precisão ao carregar números de arquivos de dados no formato JSON para uma coluna definida como um tipo de dados numérico. Alguns valores de ponto flutuante não são representados exatamente nos sistemas de computação. Como resultado, os dados copiados de um arquivo JSON podem não ser arredondados conforme esperado. Para evitar a perda de precisão, recomendamos que você use uma das seguintes alternativas:

  • Representa o número como uma string, colocando o valor em caracteres de aspas duplas.

  • Use ROUNDEC para arredondar o número em vez de truncar.

  • Em vez de usar arquivos JSON ou Avro, use arquivos de texto CSV, delimitados por caracteres, ou de largura fixa.