COPYexemples - 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.

COPYexemples

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

Ils AWS SDKs incluent 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 avec les données de la MOVIES 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 LISTING depuis un compartiment Amazon S3

L'exemple suivant se charge LISTING à partir d'un compartiment Amazon S3. La COPY commande charge tous les fichiers du /data/listing/ dossier.

copy listing from 's3://amzn-s3-demo-bucket/data/listing/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

Charger LISTING depuis un EMR cluster Amazon

L'exemple suivant charge la SALES table avec des données séparées par des tabulations provenant de fichiers compressés au format lzop dans un cluster Amazon. EMR COPYcharge tous les fichiers du myoutput/ dossier commençant parpart-.

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

L'exemple suivant charge le SALES tableau contenant des données JSON formatées dans un EMR cluster Amazon. COPYcharge tous les fichiers du myoutput/json/ dossier.

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

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

Vous pouvez utiliser un manifeste pour vous assurer que votre COPY commande charge tous les fichiers requis, et uniquement les fichiers requis, depuis 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 amzn-s3-demo-bucket dans custdata en spécifiant un préfixe :

copy category from 's3://amzn-s3-demo-bucket/custdata' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

Si seuls deux des fichiers existent en raison d'une erreur, COPY charge uniquement ces deux fichiers et se termine correctement, ce qui entraîne un chargement de données incomplet. Si le bucket contient également un fichier indésirable qui utilise le même préfixe, tel qu'un fichier nommé par custdata.backup exemple, COPY charge également ce fichier, 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 JSON formaté qui répertorie les fichiers à traiter par la COPY commande. Par exemple, le manifeste suivant charge les trois fichiers dans l’exemple précédent.

{ "entries":[ { "url":"s3://amzn-s3-demo-bucket/custdata.1", "mandatory":true }, { "url":"s3://amzn-s3-demo-bucket/custdata.2", "mandatory":true }, { "url":"s3://amzn-s3-demo-bucket/custdata.3", "mandatory":true } ] }

L'mandatoryindicateur facultatif indique s'il COPY faut se terminer si le fichier n'existe pas. L’argument par défaut est false. Indépendamment des paramètres obligatoires, s'COPYarrête si aucun fichier n'est trouvé. Dans cet exemple, COPY renvoie une erreur si aucun des fichiers n'est trouvé. 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 à partir de fichiers de données au format Parquet ORC ou au format Parquet, un meta champ est obligatoire, comme illustré dans l'exemple suivant.

{ "entries":[ { "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata", "mandatory":true, "meta":{ "content_length":99 } }, { "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata", "mandatory":true, "meta":{ "content_length":99 } } ] }

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

copy customer from 's3://amzn-s3-demo-bucket/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 montre comment JSON charger des données avec des fichiers dont le nom commence par un horodatage.

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

Le manifeste peut répertorier les fichiers qui se trouvent dans différents compartiments, à condition que les compartiments se trouvent dans la même AWS région que le cluster.

{ "entries": [ {"url":"s3://amzn-s3-demo-bucket1/custdata1.txt","mandatory":false}, {"url":"s3://amzn-s3-demo-bucket2/custdata1.txt","mandatory":false}, {"url":"s3://amzn-s3-demo-bucket2/custdata2.txt","mandatory":false} ] }

Charger LISTING à partir d'un fichier délimité par des tuyaux (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://amzn-s3-demo-bucket/data/listings_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

Chargement LISTING à l'aide de données colonnaires au format Parquet

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

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

Chargement LISTING à l'aide de données colonnaires au format ORC

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

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

Charger EVENT avec options

L'exemple suivant charge des données séparées par des tuyaux dans la EVENT table 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 contenant des espaces sont chargées sous forme de NULL valeurs.

  • 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://amzn-s3-demo-bucket/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 VENUE à partir d'un fichier de données à largeur fixe

copy venue from 's3://amzn-s3-demo-bucket/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 CATEGORY depuis un CSV fichier

Supposons que vous souhaitiez charger le 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 DELIMITER paramètre pour spécifier une entrée séparée par des virgules, la COPY commande échoue car certains champs de saisie contiennent des virgules. Vous pouvez éviter ce problème en utilisant le CSV paramètre et en plaçant les champs contenant des virgules entre 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 soitcategory_csv.txt, vous pouvez charger le fichier à l'aide de la COPY commande suivante :

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

Pour éviter d'avoir à échapper aux guillemets doubles dans votre saisie, vous pouvez également spécifier un autre guillemet à 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 COPY commande suivante utilise QUOTE AS pour charger category_csv.txt :

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

Charger VENUE avec des valeurs explicites pour une IDENTITY colonne

L'exemple suivant suppose que lors de la création de la VENUE table, au moins une colonne (telle que la venueid colonne) a été spécifiée comme IDENTITY colonne. Cette commande remplace le IDENTITY comportement par défaut qui consiste à générer automatiquement des valeurs pour une IDENTITY colonne et charge à la place les valeurs explicites à partir du fichier venue.txt. Amazon Redshift ne vérifie pas si des IDENTITY valeurs dupliquées sont chargées dans la table lorsque vous utilisez l'option EXLICIT _IDS.

copy venue from 's3://amzn-s3-demo-bucket/data/venue.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' explicit_ids;

Charger TIME à partir d'un fichier délimité par des tuyaux GZIP

L'exemple suivant charge la TIME table à partir d'un fichier délimité par des tuyaux GZIP :

copy time from 's3://amzn-s3-demo-bucket/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 of HH:MI:SS peut également prendre en charge des fractions de secondes au-delà du niveau SS de détail d'une microseconde. Le fichier time.txt utilisé dans cet exemple contient une seule ligne, 2009-01-12 14:15:57.119568.

copy timestamp1 from 's3://amzn-s3-demo-bucket/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 variante de la VENUE table de la TICKIT base de données. Prenons l'exemple d'une NEW table VENUE _ 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');

Prenons l'exemple d'un fichier de données venue_noseats.txt qui ne contient aucune valeur pour la VENUESEATS colonne, 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'COPYinstruction suivante chargera correctement la table depuis le fichier et appliquera la DEFAULT valeur (« 1000 ») à la colonne omise :

copy venue_new(venueid, venuename, venuecity, venuestate) from 's3://amzn-s3-demo-bucket/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)

Dans l'exemple suivant, en plus de supposer qu'aucune VENUESEATS donnée n'est incluse dans le fichier, supposons également qu'aucune VENUENAME donnée 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|

En utilisant la même définition de table, l'COPYinstruction suivante échoue car aucune DEFAULT valeur n'a été spécifiée pourVENUENAME, et VENUENAME il s'agit d'une NOT NULL colonne :

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

Considérons maintenant une variante de la VENUE table qui utilise une IDENTITY colonne :

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 VENUESEATS colonne ne possède aucune valeur correspondante dans le fichier source. L'COPYinstruction suivante charge correctement la table, y compris les valeurs de IDENTITY données prédéfinies au lieu de les générer automatiquement :

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

Cette instruction échoue car elle n'inclut pas la IDENTITY colonne (elle VENUEID est absente de la liste des colonnes) mais inclut un IDS paramètre EXPLICIT _ :

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

Cette instruction échoue car elle n'inclut pas de IDS paramètre EXPLICIT _ :

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

COPYdonnées avec l'ESCAPEoption

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. Chargez ensuite le fichier avec le ESCAPE paramètre.

$ more redshiftinfo.txt 1|public\|event\|dwuser 2|public\|sales\|dwuser create table redshiftinfo(infoid int,tableinfo varchar(50)); copy redshiftinfo from 's3://amzn-s3-demo-bucket/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 ESCAPE paramètre, cette COPY commande échoue avec une Extra column(s) found erreur.

Important

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

Copier à partir d'JSONexemples

Dans les exemples suivants, vous chargez le CATEGORY tableau 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 de JSON données à l'aide de l'option « auto »

Pour être chargées à partir de JSON données à l'aide de 'auto' cette option, les JSON données doivent être constituées d'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 à partir du fichier de JSON données de l'exemple précédent, exécutez la COPY commande suivante.

copy category from 's3://amzn-s3-demo-bucket/category_object_auto.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 'auto';

Charger à partir de JSON données à l'aide de l'option « auto ignorecase »

Pour être chargées à partir de JSON données à l'aide de 'auto ignorecase' cette option, les JSON données doivent être constituées d'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 à partir du fichier de JSON données de l'exemple précédent, exécutez la COPY commande suivante.

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

Charger à partir de JSON données à l'aide d'un JSONPaths fichier

Si les objets de JSON données ne correspondent pas directement aux noms de colonnes, vous pouvez utiliser un JSONPaths fichier pour mapper les JSON éléments aux colonnes. L'ordre n'a pas d'importance dans les données JSON source, mais l'ordre des expressions du JSONPaths fichier 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 JSONPaths fichier suivant, nommécategory_jsonpath.json, met en correspondance les données source avec les colonnes du tableau.

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

Pour charger à partir du fichier de JSON données de l'exemple précédent, exécutez la COPY commande suivante.

copy category from 's3://amzn-s3-demo-bucket/category_object_paths.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://amzn-s3-demo-bucket/category_jsonpath.json';

Charger à partir de JSON tableaux à l'aide d'un fichier JSONPaths

Pour effectuer un chargement à partir de JSON données constituées d'un ensemble de tableaux, vous devez utiliser un JSONPaths fichier pour mapper les é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 JSONPaths fichier suivant, nommécategory_array_jsonpath.json, met en correspondance les données source avec les colonnes du tableau.

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

Pour charger à partir du fichier de JSON données de l'exemple précédent, exécutez la COPY commande suivante.

copy category from 's3://amzn-s3-demo-bucket/category_array_data.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';

Copier depuis des exemples Avro

Dans les exemples suivants, vous chargez le CATEGORY tableau 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. Ce qui suit montre une JSON représentation des données du category_auto.avro fichier.

{
   "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 à partir du fichier de données Avro dans l'exemple précédent, exécutez la COPY commande suivante.

copy category from 's3://amzn-s3-demo-bucket/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. Ce qui suit montre une JSON représentation des données du category_auto-ignorecase.avro fichier.

{
   "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 à partir du fichier de données Avro dans l'exemple précédent, exécutez la COPY commande suivante.

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

Charger des données depuis 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 JSONPaths fichier pour mapper les éléments du schéma aux colonnes. L'ordre des expressions du JSONPaths fichier 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 JSONPaths fichier suivant, nommécategory_path.avropath, met en correspondance les données source avec les colonnes du tableau.

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

Pour charger à partir du fichier de données Avro dans l'exemple précédent, exécutez la COPY commande suivante.

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

Préparation des fichiers pour COPY avec l'ESCAPEoption

L'exemple suivant décrit comment préparer les données pour qu'elles « échappent » aux caractères de nouvelle ligne avant de les importer dans une table Amazon Redshift à l'aide de COPY la commande associée ESCAPE au paramètre. Sans préparer les données pour délimiter les caractères de nouvelle ligne, Amazon Redshift renvoie des erreurs de chargement lorsque vous exécutez COPY la commande, car le caractère de nouvelle ligne est normalement 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 du contenu XML formaté ou des données similaires, vous devez vous assurer que tous les caractères de nouvelle ligne (\n) qui font partie du contenu sont masqués par 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 qui contient le contenu XML formaté du nlTest2.txt fichier. La deuxième colonne c2 contient des valeurs de nombres entiers chargés à partir du même fichier.

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

Note

Lorsque vous incluez le ESCAPE paramètre dans la COPY commande, il échappe à un certain nombre de caractères spéciaux, y compris la barre oblique inverse (y compris la nouvelle ligne).

copy t2 from 's3://amzn-s3-demo-bucket/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 REPLACE fonction sur chaque colonne affectée d'une table que vous souhaitez 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 bases de données qui traitent régulièrement de grandes quantités de données proposent des options permettant de spécifier les caractères d'échappement et de séparation.

Chargement d’un shapefile dans Amazon Redshift

Les exemples suivants montrent comment charger un shapefile Esri à l'aide de. 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 COPY commande. Cet exemple suppose que l'archive de shapefile norvégienne provenant du site de téléchargement de Geofabrik a été chargée dans un compartiment Amazon S3 privé de 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 le gis_osm_natural_free_1.shp dans votre GIS logiciel préféré et inspectez les colonnes de cette couche. Par défaut, l'une IDENTITY ou l'autre GEOMETRY des colonnes sont les premières. Lorsqu'une GEOMETRY colonne est la première, vous pouvez créer le tableau comme indiqué ci-dessous.

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

Ou, lorsqu'une IDENTITY colonne apparaît pour la première fois, vous pouvez créer le tableau 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);

Vous pouvez maintenant ingérer les données en utilisantCOPY.

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 COPY commande est exécutée, une erreur se produit.

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 SIMPLIFY AUTO paramètre est ajouté à la COPY commande 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

L'utilisation de SIMPLIFY AUTO max_tolerance avec une tolérance inférieure à celle calculée automatiquement entraîne probablement une erreur d'ingestion. Dans ce cas, utilisez-le 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.

Effectuez SVL_SPATIAL_SIMPLIFY une nouvelle requête pour identifier l'enregistrement qui COPY n'a pas réussi à se 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é

Amazon Redshift COPY 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 COPY commande nécessite l'GZIPoption, et la FROM clause 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;

COPYcommande avec l'NOLOADoption

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

COPY public.zipcode1 FROM 's3://amzn-s3-demo-bucket/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.