COPY dal formato JSON - Amazon Redshift

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

COPY dal formato JSON

La struttura dei dati JSON è costituita da una serie di oggetti o array. Un oggetto JSON inizia e termina con delle parentesi e contiene un insieme non ordinato di coppie nome-valore. Ogni nome e valore sono separati da due punti e le coppie sono separate da virgole. Il nome è una stringa tra doppie virgolette. I caratteri virgoletta devono essere virgolette semplici (0x22), non oblique o "smart".

Un array JSON inizia e termina con delle parentesi e contiene un insieme ordinato di valori separati da virgole. Un valore può essere una stringa tra doppie virgolette, un numero, un booleano vero o falso, nullo, un oggetto JSON o un array.

Gli oggetti e gli array JSON possono essere annidati, consentendo una struttura gerarchica dei dati. L'esempio seguente mostra una struttura di dati JSON con due oggetti validi.

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

Di seguito sono riportati gli stessi dati di due array JSON.

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

Opzioni COPY per JSON

È possibile specificare le seguenti opzioni quando si utilizza COPY con i dati in formato JSON:

  • 'auto' : COPY carica automaticamente i campi dal file JSON.

  • 'auto ignorecase': COPY carica automaticamente i campi dal file JSON ignorando la distinzione tra maiuscole e minuscole per i nomi dei campi.

  • s3://jsonpaths_file: COPY utilizza un file JSONPaths file per analizzare i dati di origine JSON. Un file JSONPath è un file di testo che contiene un singolo oggetto JSON con il nome "jsonpaths" accoppiato con un array di espressioni JSONPath. Se il nome è una stringa diversa da "jsonpaths", COPY utilizza l'argomento 'auto' invece di utilizzare il file JSONPath.

Per esempi che mostrano come caricare i dati usando 'auto', 'auto ignorecase' o un file JSONPaths e usando sia oggetti JSON che array, consultare Esempi di copia da JSON.

Opzione JSONPath

Nella sintassi di COPY di Amazon Redshift, un'espressione JSONPath specifica il percorso esplicito di un singolo elemento del nome in una struttura di dati gerarchica JSON utilizzando la notazione con parentesi o punti. Amazon Redshift non supporta elementi JSONPath, come caratteri jolly o espressioni filtro, che potrebbero determinare un percorso ambiguo o elementi con più nomi. Di conseguenza, Amazon Redshift non è in grado di analizzare strutture di dati complesse e a più livelli.

Di seguito è riportato un esempio di file JSONPath con espressioni JSONPath che utilizzano la notazione a parentesi. Il simbolo del dollaro ($) rappresenta la struttura a livello di root.

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

Nell'esempio precedente, $['location'][0] fa riferimento al primo elemento di un array. JSON utilizza un'indicizzazione dell'array basata su zero. Gli indici degli array devono essere numeri interi positivi (maggiori o uguali a zero).

L'esempio seguente mostra il file JSONPath precedente utilizzando la notazione a punti.

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

Non è possibile mischiare la notazione a parentesi e a punti nell'array jsonpaths. Le parentesi possono essere utilizzate sia nella notazione a parentesi sia nella notazione a punti per fare riferimento a un elemento dell'array.

Quando si utilizza la notazione a punti, le espressioni JSONPath non possono contenere i seguenti caratteri:

  • Virgolette singole diritte ( ' )

  • Periodo o punto ( . )

  • Parentesi ( [ ] ) salvo se utilizzate per fare riferimento a un elemento dell'array

Se il valore nella coppia nome-valore a cui fa riferimento un'espressione JSONPath è un oggetto o un array, l'intero oggetto o array viene caricato come stringa, incluse le parentesi tonde o quadre. Ad esempio, si supponga che i dati JSON contengano il seguente oggetto.

{ "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" } ] }

L'espressione JSONPath $['tags'] restituisce quindi il seguente valore.

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

L'espressione JSONPath $['friends'][1] restituisce quindi il seguente valore.

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

Ogni espressione JSONPath nell'array jsonpaths corrisponde a una colonna nella tabella di destinazione Amazon Redshift. L'ordine degli elementi dell'array jsonpaths deve corrispondere all'ordine delle colonne della tabella di destinazione o, se viene utilizzato un elenco di colonne, di quest'ultimo.

Per esempi che mostrano come caricare i dati usando l'argomento 'auto' o un file JSONPath e usando sia oggetti JSON sia array, consultare Esempi di copia da JSON.

Per informazioni su come copiare più file JSON, consultare Utilizzo di un manifest per specificare i fili di dati.

Caratteri escape in JSON

COPY carica \n come carattere newline e carica \t come carattere di tabulazione. Per caricare una barra rovesciata, crea una sequenza di escape con una barra rovesciata ( \\ ).

Ad esempio, supponiamo di avere la seguente struttura JSON in un file denominato escape.json nel bucket s3://mybucket/json/.

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

Esegui i seguenti comandi per creare la tabella ESCAPES e caricare il JSON.

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

Eseguire una query sulla tabella ESCAPES per visualizzare i risultati.

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

Perdita di precisione numerica

Potrebbe verificarsi una perdita di precisione quando carichi numeri da file di dati in formato JSON in una colonna definita come tipo di dati numerico. Alcuni valori float non sono rappresentati con esattezza nei sistemi informatici. Di conseguenza, i dati copiati da un file JSON potrebbero non essere arrotondati come previsto. Per evitare una perdita di precisione, consigliamo di utilizzare una delle seguenti alternative:

  • Rappresentare il numero come stringa racchiudendo il valore in caratteri di doppia virgoletta.

  • Utilizza ROUNDEC per arrotondare il numero invece di troncarlo.

  • Invece di utilizzare file JSON o Avro, utilizza file di testo CSV, delimitati da caratteri o a larghezza fissa.