web-dev-qa-db-fra.com

Comment copier un fichier de données CSV sur Amazon RedShift?

J'essaie de migrer certaines tables MySQL vers Amazon Redshift, mais j'ai rencontré quelques problèmes.

Les étapes sont simples: 1. Videz la table MySQL dans un fichier csv. 2. Téléchargez le fichier csv dans S3. 3. Copiez le fichier de données dans RedShift.

Une erreur se produit à l'étape 3:

La commande SQL est:

copie TABLE_A de 's3: //ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' délimiteur ',' csv;

L'information d'erreur:

Une erreur s'est produite lors de l'exécution de la commande SQL: copie TABLE_A depuis 's3: //ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx ERREUR: COPY CSV n'est pas pris en charge [SQL State = 0A000] Délai d'exécution: 0.53s 1 déclaration (s) ont échoué.

Je ne sais pas si le format du fichier csv est limité, disons les délimiteurs et les guillemets, je ne le trouve pas dans les documents.

Quelqu'un peut aider?

12
ciphor

Le problème est finalement résolu en utilisant:

copie TABLE_A de 's3: //ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' délimiteur ',' removequotes;

Plus d'informations peuvent être trouvées ici http://docs.aws.Amazon.com/redshift/latest/dg/r_COPY.html

14
ciphor

Désormais, Amazon Redshift prend en charge l’option CSV pour la commande COPY. Il est préférable d'utiliser cette option pour importer correctement des données au format CSV. Le format est montré ci-dessous.

COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV;

Le délimiteur par défaut est (,) et les guillemets par défaut est ("). Vous pouvez également importer des données au format TSV avec CSV et l'option DELIMITER comme celle-ci.

COPY [table-name] from 's3://[bucket-name]/[file-path or prefix]' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' CSV DELIMITER '\t';

Il existe certains inconvénients à utiliser l'ancienne méthode (DELIMITER et REMOVEQUOTES) que REMOVEQUOTES ne prend pas en charge pour avoir une nouvelle ligne ou un caractère de délimitation dans un fichier fermé. Si les données peuvent inclure ce type de caractères, vous devez utiliser l'option CSV.

Voir le lien suivant pour les détails.

http://docs.aws.Amazon.com/redshift/latest/dg/r_COPY.html

9
Masashi Miyazaki

Si vous voulez enregistrer votre propre code/vous avez un cas d'utilisation très basique, vous pouvez utiliser Amazon Data Pipeline. Il statistique une instance ponctuelle et effectue la transformation au sein du réseau Amazon. C'est un outil très intuitif (mais très simple). de sorte que vous ne pouvez pas faire des choses complexes avec elle)

1
asafm

On dirait que vous essayez de charger un fichier local dans la table REDSHIFT. Le fichier CSV doit être sur S3 pour que la commande COPY fonctionne.

Si vous pouvez extraire des données d'une table dans un fichier CSV, vous disposez d'une option de script supplémentaire. Vous pouvez utiliser le combo Python/boto/psycopg2 pour programmer votre chargement CSV sur Amazon Redshift.

Dans mon MySQL_To_Redshift_Loader je fais ce qui suit:

  1. Extrayez les données de MySQL dans un fichier temporaire.

    loadConf=[ db_client_dbshell ,'-u', opt.mysql_user,'-p%s' % opt.mysql_pwd,'-D',opt.mysql_db_name, '-h', opt.mysql_db_server]    
    ...
    q="""
    %s %s
    INTO OUTFILE '%s'
    FIELDS TERMINATED BY '%s'
    ENCLOSED BY '%s'
    LINES TERMINATED BY '\r\n';
    """ % (in_qry, limit, out_file, opt.mysql_col_delim,opt.mysql_quote)
    p1 = Popen(['echo', q], stdout=PIPE,stderr=PIPE,env=env)
    p2 = Popen(loadConf, stdin=p1.stdout, stdout=PIPE,stderr=PIPE)
    ...
    
  2. Compressez et chargez les données sur S3 à l'aide du module boto Python et du téléchargement en plusieurs parties.

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
    bucket = conn.get_bucket(bucket_name)
    k = Key(bucket)
    k.key = s3_key_name
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr )
    
  3. Utilisez la commande psycopg2 COPY pour ajouter des données à la table Redshift.

    sql="""
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader)
    
0
olekb

Tu peux essayer avec ça

copie TABLE_A de 's3: //ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' csv;

CSV lui-même signifie des valeurs séparées par des virgules, il n'est pas nécessaire de fournir un délimiteur avec cela. S'il vous plaît se référer lien.

[ http://docs.aws.Amazon.com/redshift/latest/dg/copy-parameters-data-format.html#copy-format]

0
Dipesh Palod

Puisque la résolution a déjà été fournie, je ne répéterai pas l'évidence.

Toutefois, si vous rencontrez des erreurs que vous ne pouvez pas comprendre, exécutez simplement votre plan de travail lorsque vous êtes connecté à l’un des comptes Redshift:

select * from stl_load_errors [where ...];

stl_load_errors contient toutes les erreurs de chargement d'Amazon RS de manière historique lorsqu'un utilisateur normal peut afficher les détails correspondant à son propre compte, mais qu'un super-utilisateur peut disposer de tous les accès.

Les détails sont capturés de manière détaillée à l'adresse suivante: Amazon STL Load Errors Documentation

0
Yusuf Hassan

Un peu tard pour commenter mais ça peut être utile: -

Vous pouvez utiliser un projet open source pour copier des tables directement de mysql vers redshift - sqlshift .

Cela nécessite seulement une étincelle et si vous avez du fil, vous pouvez également l'utiliser.

Avantages: - Il décidera automatiquement distkey et entrelacé clé de tri en utilisant la clé primaire.

0
Devavrata