Exemples de commandes COPY - 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.

Exemples de commandes COPY

Note

Ces exemples contiennent des sauts de ligne pour faciliter la lecture. N’incluez pas de sauts de ligne, ni d’espaces dans votre chaîne credentials-args.

Charger FAVORITEMOVIES depuis une table DynamoDB

Les kits SDK AWS contiennent un exemple simple de création d’une table DynamoDB appelée Movies. (Pour cet exemple, consultez Mise en route avec DynamoDB.) L’exemple suivant charge la table Amazon Redshift MOVIES avec les données provenant de la table DynamoDB. La table Amazon Redshift doit déjà exister dans la base de données.

copy favoritemovies from 'dynamodb://Movies' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' readratio 50;

Charger la table LISTING depuis un compartiment Amazon S3

L’exemple suivant charge la table LISTING depuis un compartiment Amazon S3. La commande COPY charge tous les fichiers dans le dossier /data/listing/.

copy listing from 's3://mybucket/data/listing/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

Charger la table LISTING depuis un cluster Amazon EMR

L’exemple suivant charge la table SALES avec les données délimités par des tabulations des fichiers compressés lzop dans un cluster Amazon EMR. La commande COPY charge tous les fichiers du dossier myoutput/ qui commencent par part-.

copy sales from 'emr://j-SAMPLE2B500FC/myoutput/part-*' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '\t' lzop;

L’exemple suivant charge la table SALES avec des données au format JSON dans un cluster Amazon EMR. La commande COPY charge tous les fichiers du dossier myoutput/json/.

copy sales from 'emr://j-SAMPLE2B500FC/myoutput/json/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' JSON 's3://mybucket/jsonpaths.txt';

Utilisation d’un manifeste pour spécifier les fichiers de données

Vous pouvez utiliser un manifeste pour vous assurer que votre commande COPY charge tous les fichiers requis et uniquement les fichiers requis, à partir d’Amazon S3. Vous pouvez également utiliser un manifeste lorsque vous avez besoin de charger plusieurs fichiers de différents compartiments ou des fichiers qui ne partagent pas le même préfixe.

Par exemple, supposons que vous devez charger les trois fichiers suivants : custdata1.txt, custdata2.txt et custdata3.txt. Vous pouvez utiliser la commande suivante pour charger tous les fichiers qui commencent par mybucket dans custdata en spécifiant un préfixe :

copy category from 's3://mybucket/custdata' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

S’il n’existe que deux des fichiers en raison d’une erreur, la commande COPY charge uniquement ces deux fichiers et se termine correctement, ce qui entraîne une charge de données incomplète. Si le compartiment contient également un fichier indésirable qui utilise le même préfixe, par exemple, un fichier nommé custdata.backup, la commande COPY charge ce fichier également, ce qui entraîne le chargement de données indésirables.

Pour vous assurer que tous les fichiers nécessaires sont chargés et pour empêcher que des fichiers indésirables soient chargés, vous pouvez utiliser un fichier manifeste. Le manifeste est un fichier texte au format JSON qui répertorie les fichiers à traiter par la commande COPY. Par exemple, le manifeste suivant charge les trois fichiers dans l’exemple précédent.

{ "entries":[ { "url":"s3://mybucket/custdata.1", "mandatory":true }, { "url":"s3://mybucket/custdata.2", "mandatory":true }, { "url":"s3://mybucket/custdata.3", "mandatory":true } ] }

L’indicateur mandatory facultatif indique si la commande COPY doit s’arrêter si le fichier n’existe pas. La valeur par défaut est false. Quels que soient les paramètres obligatoires, la commande COPY s’arrête si aucun fichier n’est trouvé. Dans cet exemple, la commande COPY renvoie une erreur si l’un des fichiers est introuvable. Les fichiers indésirables qui peuvent avoir été collectés si vous avez spécifié uniquement un préfixe de clé, comme custdata.backup, sont ignorés, car ils ne sont pas sur le manifeste.

Lors du chargement des fichiers de données au format ORC or Parquet, le champ meta est obligatoire, comme illustré dans l’exemple suivant.

{ "entries":[ { "url":"s3://mybucket-alpha/orc/2013-10-04-custdata", "mandatory":true, "meta":{ "content_length":99 } }, { "url":"s3://mybucket-beta/orc/2013-10-05-custdata", "mandatory":true, "meta":{ "content_length":99 } } ] }

L’exemple suivant utilise un manifeste nommé cust.manifest.

copy customer from 's3://mybucket/cust.manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as orc manifest;

Vous pouvez utiliser un manifeste pour charger les fichiers de différents compartiments ou les fichiers qui ne partagent pas le même préfixe. L’exemple suivant illustre le format JSON permettant de charger des données avec des fichiers dont les noms commencent par un horodatage.

{ "entries": [ {"url":"s3://mybucket/2013-10-04-custdata.txt","mandatory":true}, {"url":"s3://mybucket/2013-10-05-custdata.txt","mandatory":true}, {"url":"s3://mybucket/2013-10-06-custdata.txt","mandatory":true}, {"url":"s3://mybucket/2013-10-07-custdata.txt","mandatory":true} ] }

Le manifeste peut afficher les fichiers qui sont dans des compartiments différents, pour autant que les compartiments sont dans la même région AWS que le cluster.

{ "entries": [ {"url":"s3://mybucket-alpha/custdata1.txt","mandatory":false}, {"url":"s3://mybucket-beta/custdata1.txt","mandatory":false}, {"url":"s3://mybucket-beta/custdata2.txt","mandatory":false} ] }

Charger la table LISTING à partir d’un fichier séparés par une barre verticale (délimiteur par défaut)

L’exemple suivant est un cas très simple dans lequel aucune option n’est spécifiée et le fichier d’entrée contient le délimiteur par défaut, une barre verticale (’|’).

copy listing from 's3://mybucket/data/listings_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

Charger LISTING en utilisant des données en colonnes en format Parquet

L’exemple suivant charge des données depuis un dossier sur Amazon S3 nommé parquet.

copy listing from 's3://mybucket/data/listings/parquet/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as parquet;

Chargement du LISTING à l’aide de données en colonnes au format ORC

L’exemple suivant charge des données depuis un dossier sur Amazon S3 nommé orc.

copy listing from 's3://mybucket/data/listings/orc/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as orc;

Charger la table EVENT avec des options

L’exemple suivant charge des données séparées par une barre verticale dans la table EVENT et applique les règles suivantes :

  • Si des paires de guillemets anglais sont utilisées pour entourer des chaînes de caractères, elles sont supprimées.

  • Les chaînes vides et les chaînes qui contiennent des espaces vides sont chargées en tant que valeurs NULL.

  • La charge échoue si plus de 5 erreurs sont renvoyées.

  • Les valeurs d’horodatage doivent être conformes au format spécifié ; par exemple, un horodatage valide est 2008-09-26 05:43:12.

copy event from 's3://mybucket/data/allevents_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' removequotes emptyasnull blanksasnull maxerror 5 delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS';

Charger la table VENUE à partir d’un fichier de données de largeur fixe

copy venue from 's3://mybucket/data/venue_fw.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';

L’exemple précédent suppose un fichier de données au format identique à celui des exemples de données affichés. Dans le prochain exemple, les espaces se comportent comme des espaces réservés afin que toutes les colonnes soient de la même largeur, tel qu’indiqué dans la spécification :

1 Toyota Park Bridgeview IL0 2 Columbus Crew Stadium Columbus OH0 3 RFK Stadium Washington DC0 4 CommunityAmerica BallparkKansas City KS0 5 Gillette Stadium Foxborough MA68756

Charger la table CATEGORY à partir d’un fichier CSV

Supposons que vous voulez charger la table CATEGORY avec les valeurs indiquées dans le tableau suivant.

catid catgroup catName catdesc
12 Shows Musicals Musical theatre
13 Shows Plays All "non-musical" theatre
14 Shows Opera All opera, light, and "rock" opera
15 Concerts Classical All symphony, concerto, and choir concerts

L’exemple suivant montre le contenu d’un fichier texte avec les champs de valeurs séparés par des virgules.

12,Shows,Musicals,Musical theatre 13,Shows,Plays,All "non-musical" theatre 14,Shows,Opera,All opera, light, and "rock" opera 15,Concerts,Classical,All symphony, concerto, and choir concerts

Si vous chargez le fichier à l’aide du paramètre DELIMITER pour spécifier des entrées séparées par des virgules, la commande COPY échoue parce que certains champs d’entrée contiennent des virgules. Vous pouvez éviter ce problème en utilisant le paramètre CSV et en entourant les champs qui contiennent des virgules de guillemets. Si le guillemet s’affiche au sein d’une chaîne entre guillemets, vous devez doubler le guillemet. Le guillemet par défaut est double. Vous devez donc ajouter à tous les guillemets doubles des guillemets doubles supplémentaires. Votre nouveau fichier d’entrée ressemble à quelque chose comme ça.

12,Shows,Musicals,Musical theatre 13,Shows,Plays,"All ""non-musical"" theatre" 14,Shows,Opera,"All opera, light, and ""rock"" opera" 15,Concerts,Classical,"All symphony, concerto, and choir concerts"

En supposant que le nom du fichier est category_csv.txt, vous pouvez charger le fichier en utilisant la commande COPY suivante :

copy category from 's3://mybucket/data/category_csv.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' csv;

Sinon, pour éviter d’avoir à doubler les guillemets doubles de votre entrée, vous pouvez spécifier un guillemet différent à l’aide du paramètre QUOTE AS. Par exemple, la version suivante de category_csv.txt utilise ’%’ comme caractère de citation :

12,Shows,Musicals,Musical theatre 13,Shows,Plays,%All "non-musical" theatre% 14,Shows,Opera,%All opera, light, and "rock" opera% 15,Concerts,Classical,%All symphony, concerto, and choir concerts%

La commande COPY suivante utilise QUOTE AS pour charger category_csv.txt :

copy category from 's3://mybucket/data/category_csv.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' csv quote as '%';

Charger la table VENUE avec des valeurs EXPLICIT pour une colonne IDENTITY

L’exemple suivant suppose que lorsque la table VENUE a été créée, au moins une colonne (telle que la colonne venueid) a été désignée comme colonne IDENTITY. Cette commande se substitue au comportement IDENTITY par défaut pour la génération automatique de valeurs pour une colonne IDENTITY et charge à la place des valeurs explicites depuis le fichier venue.txt. Amazon Redshift ne vérifie pas si des valeurs IDENTITY dupliquées sont chargées dans la table lors de l’utilisation de l’option EXLICIT_IDS.

copy venue from 's3://mybucket/data/venue.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' explicit_ids;

Charger la table TIME à partir d’un fichier GZIP séparé par une barre verticale

L’exemple suivant charge la table TIME à partir d’un fichier GZIP séparé par une barre verticale :

copy time from 's3://mybucket/data/timerows.gz' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' gzip delimiter '|';

Charger un horodatage ou une datation

L’exemple suivant charge les données avec un horodatage formaté.

Note

Le TIMEFORMAT de HH:MI:SS peut également prendre en charge des fractions de secondes au-delà de SS jusqu’aux microsecondes. Le fichier time.txt utilisé dans cet exemple contient une seule ligne, 2009-01-12 14:15:57.119568.

copy timestamp1 from 's3://mybucket/data/time.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' timeformat 'YYYY-MM-DD HH:MI:SS';

Le résultat de cette copie est le suivant :

select * from timestamp1; c1 ---------------------------- 2009-01-12 14:15:57.119568 (1 row)

Charger les données d’un fichier avec des valeurs par défaut

L’exemple suivant utilise une variation de la table VENUE dans la base de données TICKIT. Prenons une table VENUE_NEW définie avec l’instruction suivante :

create table venue_new( venueid smallint not null, venuename varchar(100) not null, venuecity varchar(30), venuestate char(2), venueseats integer not null default '1000');

Imaginons un fichier de données venue_noseats.txt qui ne contient aucune valeur pour la colonne VENUESEATS, comme illustré dans l’exemple suivant :

1|Toyota Park|Bridgeview|IL| 2|Columbus Crew Stadium|Columbus|OH| 3|RFK Stadium|Washington|DC| 4|CommunityAmerica Ballpark|Kansas City|KS| 5|Gillette Stadium|Foxborough|MA| 6|New York Giants Stadium|East Rutherford|NJ| 7|BMO Field|Toronto|ON| 8|The Home Depot Center|Carson|CA| 9|Dick's Sporting Goods Park|Commerce City|CO| 10|Pizza Hut Park|Frisco|TX|

L’instruction COPY suivante charge correctement la table depuis le fichier et applique la valeur DEFAULT (’1000’) à la colonne omise :

copy venue_new(venueid, venuename, venuecity, venuestate) from 's3://mybucket/data/venue_noseats.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

Maintenant, affichez la table chargée :

select * from venue_new order by venueid; venueid | venuename | venuecity | venuestate | venueseats ---------+----------------------------+-----------------+------------+------------ 1 | Toyota Park | Bridgeview | IL | 1000 2 | Columbus Crew Stadium | Columbus | OH | 1000 3 | RFK Stadium | Washington | DC | 1000 4 | CommunityAmerica Ballpark | Kansas City | KS | 1000 5 | Gillette Stadium | Foxborough | MA | 1000 6 | New York Giants Stadium | East Rutherford | NJ | 1000 7 | BMO Field | Toronto | ON | 1000 8 | The Home Depot Center | Carson | CA | 1000 9 | Dick's Sporting Goods Park | Commerce City | CO | 1000 10 | Pizza Hut Park | Frisco | TX | 1000 (10 rows)

Pour l’exemple suivant, en plus de supposer qu’aucune donnée VENUESEATS n’est incluse dans le fichier, supposons également qu’aucune donnée VENUENAME n’est incluse :

1||Bridgeview|IL| 2||Columbus|OH| 3||Washington|DC| 4||Kansas City|KS| 5||Foxborough|MA| 6||East Rutherford|NJ| 7||Toronto|ON| 8||Carson|CA| 9||Commerce City|CO| 10||Frisco|TX|

A l’aide de la même définition de table, l’instructions COPY suivante échoue, car aucune valeur DEFAULT n’a été spécifié pour VENUENAME et VENUENAME est une colonne NOT NULL :

copy venue(venueid, venuecity, venuestate) from 's3://mybucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

Maintenant, prenons une variation de la table VENUE qui utilise une colonne IDENTITY :

create table venue_identity( venueid int identity(1,1), venuename varchar(100) not null, venuecity varchar(30), venuestate char(2), venueseats integer not null default '1000');

Comme dans l’exemple précédent, supposons que la colonne VENUESEATS n’a aucune valeur correspondante dans le fichier source. L’instruction COPY suivante charge la table avec succès, y compris les valeurs de données IDENTITY prédéfinies au lieu de générer ces valeurs :

copy venue(venueid, venuename, venuecity, venuestate) from 's3://mybucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' explicit_ids;

Cette instruction échoue, car elle n’inclut pas la colonne IDENTITY (VENUEID est manquante dans la liste de colonnes) mais inclut un paramètre EXPLICIT_IDS :

copy venue(venuename, venuecity, venuestate) from 's3://mybucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' explicit_ids;

Cette instruction échoue, car elle n’inclut pas un paramètre EXPLICIT_IDS :

copy venue(venueid, venuename, venuecity, venuestate) from 's3://mybucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

Exécuter la commande COPY des données avec l’option ESCAPE

L’exemple suivant présente le chargement des caractères qui correspondent au délimiteur (dans ce cas, la barre verticale). Dans le fichier d’entrée, assurez-vous qu’une barre oblique inverse (\) est ajoutée à toutes les barres verticales (|) que vous voulez charger. Puis chargez le fichier avec le paramètre ESCAPE.

$ more redshiftinfo.txt 1|public\|event\|dwuser 2|public\|sales\|dwuser create table redshiftinfo(infoid int,tableinfo varchar(50)); copy redshiftinfo from 's3://mybucket/data/redshiftinfo.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' escape; select * from redshiftinfo order by 1; infoid | tableinfo -------+-------------------- 1 | public|event|dwuser 2 | public|sales|dwuser (2 rows)

Sans le paramètre ESCAPE, cette commande COPY échoue avec une erreur Extra column(s) found.

Important

Si vous chargez vos données à l’aide d’une commande COPY avec le paramètre ESCAPE, vous devez également spécifier le paramètre ESCAPE avec votre commande UNLOAD pour générer le fichier de sortie réciproque. De même, si vous exécuter la commande UNLOAD à l’aide du paramètre ESCAPE, vous devez utiliser la commande ESCAPE lorsque vous exécutez la commande COPY sur les mêmes données.

Copier à partir d’exemples JSON

Dans les exemples suivants, vous chargez la table CATEGORY avec les données suivantes.

CATID CATGROUP CATNAME CATDESC
1 Sport MLB Major League Baseball
2 Sport NHL National Hockey League
3 Sport NFL National Football League
4 Sport NBA National Basketball Association
5 Concerts Classical All symphony, concerto, and choir concerts

Charger des données JSON à l’aide de l’option ’auto’

Pour charger des données JSON à l’aide de l’option 'auto', les données JSON doivent consister en un ensemble d’objets. Les noms de clés doivent correspondre aux noms de colonnes, mais dans ce cas, l’ordre n’a pas d’importance. Ce qui suit montre le contenu d’un fichier nommé category_object_auto.json.

{ "catdesc": "Major League Baseball", "catid": 1, "catgroup": "Sports", "catname": "MLB" } { "catgroup": "Sports", "catid": 2, "catname": "NHL", "catdesc": "National Hockey League" }{ "catid": 3, "catname": "NFL", "catgroup": "Sports", "catdesc": "National Football League" } { "bogus": "Bogus Sports LLC", "catid": 4, "catgroup": "Sports", "catname": "NBA", "catdesc": "National Basketball Association" } { "catid": 5, "catgroup": "Shows", "catname": "Musicals", "catdesc": "All symphony, concerto, and choir concerts" }

Pour charger depuis le fichier de données JSON dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_object_auto.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 'auto';

Charger des données JSON à l’aide de l’option ’auto ignorecase’

Pour charger des données JSON à l’aide de l’option 'auto ignorecase', les données JSON doivent consister en un ensemble d’objets. Le cas des noms de clés n’a pas besoin de correspondre aux noms de colonnes et l’ordre n’a pas d’importance. Ce qui suit montre le contenu d’un fichier nommé category_object_auto-ignorecase.json.

{ "CatDesc": "Major League Baseball", "CatID": 1, "CatGroup": "Sports", "CatName": "MLB" } { "CatGroup": "Sports", "CatID": 2, "CatName": "NHL", "CatDesc": "National Hockey League" }{ "CatID": 3, "CatName": "NFL", "CatGroup": "Sports", "CatDesc": "National Football League" } { "bogus": "Bogus Sports LLC", "CatID": 4, "CatGroup": "Sports", "CatName": "NBA", "CatDesc": "National Basketball Association" } { "CatID": 5, "CatGroup": "Shows", "CatName": "Musicals", "CatDesc": "All symphony, concerto, and choir concerts" }

Pour charger depuis le fichier de données JSON dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_object_auto ignorecase.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 'auto ignorecase';

Charger à partir des données JSON à l’aide d’un fichier JSONPaths

Si les objets de données JSON ne correspondent pas directement aux noms de colonnes, vous pouvez utiliser un fichier JSONPaths pour mapper les éléments JSON aux colonnes. L’ordre n’a pas d’importance dans les données source JSON, mais l’ordre des expressions du fichier JSONPaths doit correspondre à l’ordre des colonnes. Supposons que vous ayez le fichier de données suivant, nommé category_object_paths.json.

{ "one": 1, "two": "Sports", "three": "MLB", "four": "Major League Baseball" } { "three": "NHL", "four": "National Hockey League", "one": 2, "two": "Sports" } { "two": "Sports", "three": "NFL", "one": 3, "four": "National Football League" } { "one": 4, "two": "Sports", "three": "NBA", "four": "National Basketball Association" } { "one": 6, "two": "Shows", "three": "Musicals", "four": "All symphony, concerto, and choir concerts" }

Le fichier JSONPaths suivant, nommé category_jsonpath.json, mappe les données source aux colonnes de la table.

{ "jsonpaths": [ "$['one']", "$['two']", "$['three']", "$['four']" ] }

Pour charger depuis le fichier de données JSON dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_object_paths.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://mybucket/category_jsonpath.json';

Charger à partir des tableaux JSON à l’aide d’un fichier JSONPaths

Pour charger à partir des données JSON qui se composent d’un ensemble de tableaux, vous devez utiliser un fichier JSONPaths pour mapper des éléments du tableau aux colonnes. Supposons que vous ayez le fichier de données suivant, nommé category_array_data.json.

[1,"Sports","MLB","Major League Baseball"] [2,"Sports","NHL","National Hockey League"] [3,"Sports","NFL","National Football League"] [4,"Sports","NBA","National Basketball Association"] [5,"Concerts","Classical","All symphony, concerto, and choir concerts"]

Le fichier JSONPaths suivant, nommé category_array_jsonpath.json, mappe les données source aux colonnes de la table.

{ "jsonpaths": [ "$[0]", "$[1]", "$[2]", "$[3]" ] }

Pour charger depuis le fichier de données JSON dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_array_data.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://mybucket/category_array_jsonpath.json';

Copier depuis des exemples Avro

Dans les exemples suivants, vous chargez la table CATEGORY avec les données suivantes.

CATID CATGROUP CATNAME CATDESC
1 Sport MLB Major League Baseball
2 Sport NHL National Hockey League
3 Sport NFL National Football League
4 Sport NBA National Basketball Association
5 Concerts Classical All symphony, concerto, and choir concerts

Charger à partir des données Avro à l’aide de l’option ’auto’

Pour charger à partir des données Avro à l’aide de l’argument 'auto', les noms de champs du schéma Avro doivent correspondre aux noms de colonnes. Lorsque vous utilisez l’argument 'auto', l’ordre n’est pas important. Ce qui suit montre le schéma d’un fichier nommé category_auto.avro.

{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}

Les données contenues dans un fichier Avro sont au format binaire, elles ne sont donc pas explicites. L’exemple suivant illustre une représentation JSON des données dans le fichier category_auto.avro.

{
   "catid": 1,
   "catdesc": "Major League Baseball",
   "catname": "MLB",
   "catgroup": "Sports"
}
{
   "catid": 2,
   "catdesc": "National Hockey League",
   "catname": "NHL",
   "catgroup": "Sports"
}
{
   "catid": 3,
   "catdesc": "National Basketball Association",
   "catname": "NBA",
   "catgroup": "Sports"
}
{
   "catid": 4,
   "catdesc": "All symphony, concerto, and choir concerts",
   "catname": "Classical",
   "catgroup": "Concerts"
}

Pour charger depuis le fichier de données Avro dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_auto.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as avro 'auto';

Charger à partir des données Avro à l’aide de l’option ’auto ignorecase’

Pour charger à partir des données Avro à l’aide de l’argument 'auto ignorecase', la casse des noms de champs du schéma Avro ne doit pas forcément correspondre à celle des noms de colonnes. Lorsque vous utilisez l’argument 'auto ignorecase', l’ordre n’est pas important. Ce qui suit montre le schéma d’un fichier nommé category_auto-ignorecase.avro.

{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "CatID", "type": "int"},
        {"name": "CatDesc", "type": "string"},
        {"name": "CatName", "type": "string"},
        {"name": "CatGroup", "type": "string"},
}

Les données contenues dans un fichier Avro sont au format binaire, elles ne sont donc pas explicites. L’exemple suivant illustre une représentation JSON des données dans le fichier category_auto-ignorecase.avro.

{
   "CatID": 1,
   "CatDesc": "Major League Baseball",
   "CatName": "MLB",
   "CatGroup": "Sports"
}
{
   "CatID": 2,
   "CatDesc": "National Hockey League",
   "CatName": "NHL",
   "CatGroup": "Sports"
}
{
   "CatID": 3,
   "CatDesc": "National Basketball Association",
   "CatName": "NBA",
   "CatGroup": "Sports"
}
{
   "CatID": 4,
   "CatDesc": "All symphony, concerto, and choir concerts",
   "CatName": "Classical",
   "CatGroup": "Concerts"
}

Pour charger depuis le fichier de données Avro dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_auto-ignorecase.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as avro 'auto ignorecase';

Charger des données Avro à l’aide d’un fichier JSONPaths

Si les noms de champs du schéma Avro ne correspondent pas directement aux noms de colonnes, vous pouvez utiliser un fichier JSONPaths pour mapper les éléments de schéma aux colonnes. L’ordre des expressions du fichier JSONPaths doit correspondre à l’ordre des colonnes.

Supposons que vous ayez un fichier de données nommé category_paths.avro qui contient les mêmes données que dans l’exemple précédent, mais avec le schéma suivant.

{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "desc", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "group", "type": "string"},
        {"name": "region", "type": "string"} 
     ]
}

Le fichier JSONPaths suivant, nommé category_path.avropath, mappe les données source aux colonnes de la table.

{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}

Pour charger depuis le fichier de données Avro dans l’exemple précédent, exécutez la commande COPY suivante.

copy category from 's3://mybucket/category_object_paths.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format avro 's3://mybucket/category_path.avropath ';

Préparation de fichiers pour la commande COPY avec l’option ESCAPE

L’exemple suivant décrit comment préparer les données pour insérer des caractères de saut de ligne avant d’importer les données dans une table Amazon Redshift à l’aide de la commande COPY avec le paramètre ESCAPE. Si vous ne préparez pas les données afin de délimiter les caractères de saut ligne, Amazon Redshift renvoie des erreurs de charge lorsque vous exécutez la commande COPY, car le caractère de saut de ligne est généralement utilisé comme séparateur d’enregistrements.

Par exemple, prenons un fichier ou une colonne dans une table externe que vous voulez copier dans une table Amazon Redshift. Si le fichier ou la colonne contient des données de contenu au format XML ou similaires, vous devez vous assurer que tous les caractères de saut de ligne (\n) qui font partie du contenu sont insérés avec la barre oblique inverse (\).

Si un fichier ou une table contient des caractères de saut de ligne imbriqués, cela offre un modèle relativement facile à mettre en correspondance. Chaque caractère de saut de ligne imbriqué suit presque toujours un caractère > avec, potentiellement, des caractères d’espace (' ' ou une tabulation) entre les deux, comme vous pouvez le voir dans l’exemple suivant d’un fichier texte intitulé nlTest1.txt.

$ cat nlTest1.txt <xml start> <newline characters provide> <line breaks at the end of each> <line in content> </xml>|1000 <xml> </xml>|2000

Avec l’exemple suivant, vous pouvez exécuter un utilitaire de traitement de texte permettant de prétraiter le fichier source et d’insérer des caractères d’échappement si nécessaire. (Le caractère | est destiné à être utilisé comme délimiteur pour séparer les données de la colonne lorsqu’elles sont copiées dans une table Amazon Redshift.)

$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt

De même, vous pouvez utiliser Perl pour effectuer une opération similaire :

cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt

Pour faciliter le chargement des données à partir du fichier nlTest2.txt dans Amazon Redshift, nous avons créé une table à deux colonnes dans Amazon Redshift. La première colonne c1, est une colonne de caractères dont le contenu est au format XML issu du fichier nlTest2.txt. La deuxième colonne c2 contient des valeurs de nombres entiers chargés à partir du même fichier.

Après avoir exécuté la commande sed, vous pouvez charger correctement des données à partir du fichier nlTest2.txt dans une table Amazon Redshift à l’aide du paramètre ESCAPE.

Note

Lorsque vous incluez le paramètre ESCAPE avec la commande COPY, il insère un certain nombre de caractères spéciaux, parmi lesquels la barre oblique (ainsi que le saut de ligne).

copy t2 from 's3://mybucket/data/nlTest2.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' escape delimiter as '|'; select * from t2 order by 2; c1 | c2 -------------+------ <xml start> <newline characters provide> <line breaks at the end of each> <line in content> </xml> | 1000 <xml> </xml> | 2000 (2 rows)

Vous pouvez préparer les fichiers de données exportés à partir de bases de données externes d’une manière similaire. Par exemple, avec une base de données Oracle, vous pouvez utiliser la fonction REPLACE sur chaque colonne concernée dans une table que vous voulez copier dans Amazon Redshift.

SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml

En outre, de nombreux outils d’exportation et d’extraction, de transformation, de chargement (ETL) de la base de données qui traitent régulièrement de grandes quantités de données offrent des options permettant de spécifier des caractères d’échappement et délimiteurs.

Chargement d’un shapefile dans Amazon Redshift

Les exemples suivants montrent comment charger un shapefile Esri à l’aide de la commande COPY. Pour plus d’informations sur le chargement des fichiers de forme, consultez Chargement d’un shapefile dans Amazon Redshift.

Chargement d’un shapefile

Les étapes suivantes montrent comment ingérer des OpenStreetMap données depuis Amazon S3 à l'aide de la commande COPY. Cet exemple suppose que l’archive de shapefile Norway depuis le site de téléchargement de Geofabrik a été téléchargée dans un compartiment privé Amazon S3 dans votre région AWS. Les fichiers .shp, .shx et .dbf doivent partager le même préfixe et le même nom de fichier Amazon S3.

Intégration des données sans simplification

Les commandes suivantes créent des tables et intègrent des données qui peuvent s’adapter à la taille géométrique maximale sans aucune simplification. Ouvrez gis_osm_natural_free_1.shp dans votre logiciel SIG préféré et inspectez les colonnes de cette couche. Par défaut, les colonnes IDENTITY ou GEOMETRY sont les premières. Lorsque la première colonne est une colonne GEOMETRY, vous pouvez créer la table comme indiqué ci-dessous.

CREATE TABLE norway_natural ( wkb_geometry GEOMETRY, osm_id BIGINT, code INT, fclass VARCHAR, name VARCHAR);

Sinon, lorsque la première colonne est une colonne IDENTITY, vous pouvez créer la table comme indiqué ci-dessous.

CREATE TABLE norway_natural_with_id ( fid INT IDENTITY(1,1), wkb_geometry GEOMETRY, osm_id BIGINT, code INT, fclass VARCHAR, name VARCHAR);

Maintenant, vous pouvez intégrer les données en utilisant la commande COPY.

COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully

Vous pouvez également intégrer les données comme indiqué ci-dessous.

COPY norway_natural_with_id FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural_with_id' completed, 83891 record(s) loaded successfully.

Intégration des données avec simplification

Les commandes suivantes créent une table et tentent d’intégrer des données qui ne rentrent pas dans la taille géométrique maximale sans aucune simplification. Inspectez le shapefile gis_osm_water_a_free_1.shp et créez la table appropriée comme indiqué ci-dessous.

CREATE TABLE norway_water ( wkb_geometry GEOMETRY, osm_id BIGINT, code INT, fclass VARCHAR, name VARCHAR);

Lorsque la commande COPY s’exécute, une erreur est renvoyée.

COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; ERROR: Load into table 'norway_water' failed. Check 'stl_load_errors' system table for details.

L’interrogation de STL_LOAD_ERRORS indique que la géométrie est trop volumineuse.

SELECT line_number, btrim(colname), btrim(err_reason) FROM stl_load_errors WHERE query = pg_last_copy_id(); line_number | btrim | btrim -------------+--------------+----------------------------------------------------------------------- 1184705 | wkb_geometry | Geometry size: 1513736 is larger than maximum supported size: 1048447

Pour résoudre ce problème, le paramètre SIMPLIFY AUTO est ajouté à la commande COPY afin de simplifier les géométries.

COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp' FORMAT SHAPEFILE SIMPLIFY AUTO CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_water' completed, 1989196 record(s) loaded successfully.

Pour afficher les lignes et les géométries simplifiées, interrogez SVL_SPATIAL_SIMPLIFY.

SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id(); query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance -------+-------------+-------------------+--------------+------------+------------+---------------------- 20 | 1184704 | -1 | 1513736 | t | 1008808 | 1.276386653895e-05 20 | 1664115 | -1 | 1233456 | t | 1023584 | 6.11707814796635e-06

Lorsque la commande SIMPLIY AUTO max_tolerance est utilisée avec une tolérance inférieure à celle calculée automatiquement, une erreur d’ingestion est généralement renvoyée. Dans ce cas, utilisez la commande MAXERROR pour ignorer les erreurs.

COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp' FORMAT SHAPEFILE SIMPLIFY AUTO 1.1E-05 MAXERROR 2 CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_water' completed, 1989195 record(s) loaded successfully. INFO: Load into table 'norway_water' completed, 1 record(s) could not be loaded. Check 'stl_load_errors' system table for details.

Interrogez à nouveau SVL_SPATIAL_SIMPLIFY pour identifier l’enregistrement que la commande COPY n’a pas réussi à charger.

SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id(); query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance -------+-------------+-------------------+--------------+------------+------------+----------------- 29 | 1184704 | 1.1e-05 | 1513736 | f | 0 | 0 29 | 1664115 | 1.1e-05 | 1233456 | t | 794432 | 1.1e-05

Dans cet exemple, le premier enregistrement n’a pas réussi à s’ajuster, c’est pourquoi la colonne simplified affiche false. Le deuxième enregistrement a été chargé dans la tolérance donnée. Toutefois, la taille finale est supérieure à l’utilisation de la tolérance calculée automatiquement sans spécifier la tolérance maximale.

Chargement à partir d’un shapefile compressé

La commande COPY Amazon Redshift prend en charge l’ingestion de données à partir d’un shapefile compressé. Tous les composants de shapefiles doivent avoir le même préfixe Amazon S3 et le même suffixe de compression. Par exemple, supposons que vous souhaitiez charger les données de l’exemple précédent. Dans ce cas, les fichiers gis_osm_water_a_free_1.shp.gz, gis_osm_water_a_free_1.dbf.gz et gis_osm_water_a_free_1.shx.gz doivent partager le même répertoire Amazon S3. La commande COPY nécessite l’option GZIP, et la clause FROM doit spécifier le fichier compressé correct, comme indiqué ci-dessous.

COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/compressed/gis_osm_natural_free_1.shp.gz' FORMAT SHAPEFILE GZIP CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully.

Chargement des données dans une table avec un ordre de colonnes différent

Si vous avez une table qui n’a pas GEOMETRY comme première colonne, vous pouvez utiliser le mappage de colonnes pour mapper des colonnes à la table cible. Par exemple, créez une table en spécifiant osm_id comme première colonne.

CREATE TABLE norway_natural_order ( osm_id BIGINT, wkb_geometry GEOMETRY, code INT, fclass VARCHAR, name VARCHAR);

Intégrez ensuite un shapefile à l’aide du mappage de colonnes.

COPY norway_natural_order(wkb_geometry, osm_id, code, fclass, name) FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural_order' completed, 83891 record(s) loaded successfully.

Chargement de données dans une table avec une colonne de géographies

Si vous disposez d’une table avec une colonne GEOGRAPHY, vous devez d’abord l’intégrer à une colonne GEOMETRY, puis convertir les objets en objets GEOGRAPHY. Par exemple, après avoir copié votre shapefile dans une colonne GEOMETRY, modifiez le tableau pour ajouter une colonne du type de données GEOGRAPHY.

ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;

Convertissez ensuite les géométries en géographies.

UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;

Vous pouvez éventuellement supprimer la colonne GEOMETRY.

ALTER TABLE norway_natural DROP COLUMN wkb_geometry;

Commande COPY avec l’option NOLOAD

Pour valider des fichiers de données avant de charger réellement les données, utilisez l’option NOLOAD avec la commande COPY. Amazon Redshift analyse le fichier d’entrée et affiche les erreurs éventuelles. L’exemple suivant utilise l’option NOLOAD et aucune ligne n’est réellement chargée dans la table.

COPY public.zipcode1 FROM 's3://mybucket/mydata/zipcode.csv' DELIMITER ';' IGNOREHEADER 1 REGION 'us-east-1' NOLOAD CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole'; Warnings: Load into table 'zipcode1' completed, 0 record(s) loaded successfully.