Exécution de la commande COPY à partir du format JSON - Amazon Redshift

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécution de la commande COPY à partir du format JSON

La structure des données JSON se compose d’un ensemble d’objets ou de tableaux. Un objet JSON commence et finit par des accolades, et contient une collection non ordonnée de paires nom-valeur. Chaque paire de nom et de valeur est séparée par deux points, et les paires sont séparées par des virgules. Le nom est une chaîne entre guillemets doubles. Les guillemets doivent être des guillemets simples (0x22), ni culbutés, ni courbes.

Un tableau JSON commence et finit par des crochets, et contient une collection ordonnée de valeurs séparées par des virgules. Une valeur peut être une chaîne comprise entre des guillemets doubles, un nombre, une valeur booléenne true ou false, null, un objet JSON ou tableau.

Les tableaux et objets JSON peuvent être imbriqués, ce qui permet d’obtenir une structure de données hiérarchique. L’exemple suivant illustre une structure de données JSON avec deux objets valides.

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

L’exemple suivant illustre les mêmes données sous forme de deux tableaux JSON.

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

Options COPY pour JSON

Vous pouvez spécifier les options suivantes lorsque vous utilisez la commande COPY avec des données au format JSON :

  • 'auto' – La commande COPY charge automatiquement les champs à partir du fichier JSON.

  • 'auto ignorecase' – La commande COPY charge automatiquement les champs à partir du fichier JSON tout en ignorant la casse des noms de champs.

  • s3://jsonpaths_file— COPY utilise un JSONPaths fichier pour analyser les données source JSON. Un JSONPaths fichier est un fichier texte qui contient un seul objet JSON dont le nom est "jsonpaths" associé à un tableau d' JSONPath expressions. Si le nom est une chaîne autre que"jsonpaths", COPY utilise l''auto'argument au lieu du JSONPaths fichier.

Pour des exemples montrant comment charger des données à l'aide de 'auto''auto ignorecase', ou d'un JSONPaths fichier, et à l'aide d'objets ou de tableaux JSON, consultezCopier à partir d’exemples JSON.

JSONPath option

Dans la syntaxe COPY d'Amazon Redshift, une JSONPath expression indique le chemin explicite vers un élément de nom unique dans une structure de données hiérarchique JSON, en utilisant soit la notation entre crochets, soit la notation par points. Amazon Redshift ne prend en charge aucun JSONPath élément, tel que les caractères génériques ou les expressions de filtre, susceptibles de donner lieu à un chemin ambigu ou à plusieurs éléments de nom. Par conséquent, Amazon Redshift ne peut pas analyser des structures de données complexes, à plusieurs niveaux.

Voici un exemple de JSONPaths fichier contenant des JSONPath expressions utilisant la notation entre crochets. Le symbole du dollar ($) représente la structure de niveau racine.

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

Dans l’exemple précédent, $['location'][0] fait référence au premier élément d’un tableau. JSON utilise l’indexation de tableau de base zéro. Les index du tableau doivent être des nombres entiers positifs (supérieurs ou égaux à zéro).

L'exemple suivant montre le JSONPaths fichier précédent en utilisant la notation par points.

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

Vous ne pouvez pas combiner la notation d’accolades et la notation de points dans le tableau jsonpaths. Les accolades peuvent être utilisées dans la notation d’accolades et la notation de points pour faire référence à un élément du tableau.

Lorsque vous utilisez la notation par points, les JSONPath expressions ne peuvent pas contenir les caractères suivants :

  • Guillemet anglais (’)

  • Point ( . )

  • Crochets ([ ]), sauf pour faire référence à un élément de tableau

Si la valeur de la paire nom-valeur référencée par une JSONPath expression est un objet ou un tableau, l'objet ou le tableau entier est chargé sous forme de chaîne, y compris les accolades. Par exemple, supposons que vos données JSON contiennent l’objet suivant.

{ "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' JSONPath expression renvoie $['tags'] ensuite la valeur suivante.

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

L' JSONPath expression renvoie $['friends'][1] ensuite la valeur suivante.

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

Chaque JSONPath expression du jsonpaths tableau correspond à une colonne de la table cible Amazon Redshift. L’ordre des éléments du tableau jsonpaths doit correspondre à celui des colonnes de la table cible ou de la liste de colonnes, si une liste de colonnes est utilisée.

Pour des exemples montrant comment charger des données à l'aide de l''auto'argument ou d'un JSONPaths fichier, et à l'aide d'objets ou de tableaux JSON, consultezCopier à partir d’exemples JSON.

Pour plus d’informations sur la copie de plusieurs fichiers JSON, consultez Utilisation d’un manifeste pour spécifier les fichiers de données.

Caractères d’échappement dans JSON

La commande COPY charge \n comme un caractère de saut de ligne et charge \t comme un caractère de tabulation. Pour charger une barre oblique inverse, précédez-la d’une barre oblique inverse ( \\ ).

Par exemple, supposons que le JSON suivant se trouve dans un fichier nommé escape.json dans le compartiment 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." }

Exécutez les commandes suivantes pour créer la table ESCAPES et charger le fichier 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';

Interrogez la table ESCAPES pour afficher les résultats.

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

Perte de précision numérique

Vous pouvez perdre de la précision lors du chargement de nombres à partir de fichiers de données en format JSON dans une colonne qui est définie comme un type de données numérique. Certaines valeurs en virgule flottantes ne seront pas représentées de manière exacte sur les systèmes informatiques. De ce fait, des données que vous copiez depuis un fichier JSON sont susceptibles de ne pas être arrondies comme vous vous y attendez. Pour éviter une perte de précision, nous recommandons l’utilisation d’une des autres solutions suivantes :

  • Représenter le nombre sous la forme d’une chaîne en plaçant la valeur entre guillemets doubles.

  • Utiliser ROUNDEC pour arrondir le nombre au lieu de le tronquer.

  • Plutôt que des fichiers JSON ou Avro, utiliser des fichiers CSV, délimités par un caractère, ou des fichiers texte à largeur fixe.