web-dev-qa-db-fra.com

Déchargement de redshift vers s3 avec en-têtes

Je sais déjà comment décharger un fichier de redshift dans s3 en un seul fichier. J'ai besoin de savoir comment décharger avec les en-têtes de colonne. Quelqu'un peut-il m'aider ou me donner un indice?

Je ne veux pas avoir à le faire manuellement en Shell ou en python.

27
Tokunbo Hiamang

Il n'y a pas d'option directe fournie par le déchargement de redshift.

Mais nous pouvons modifier les requêtes pour générer des fichiers avec des lignes auxquelles des en-têtes ont été ajoutés.

D'abord, nous essaierons avec l'option d'arrêt parallèle afin qu'il ne crée que sur fichier.

"Par défaut, UNLOAD écrit des données en parallèle sur plusieurs fichiers, en fonction du nombre de tranches dans le cluster. L'option par défaut est ON ou TRUE. Si PARALLEL est OFF ou FALSE, UNLOAD écrit dans un ou plusieurs fichiers de données en série, triés absolument selon la clause ORDER BY, le cas échéant. La taille maximale d'un fichier de données est de 6,2 Go. Par exemple, si vous déchargez 13,4 Go de données, UNLOAD crée les trois fichiers suivants. "

Pour avoir des en-têtes dans les fichiers de déchargement, nous ferons comme ci-dessous.

Supposons que vous ayez un tableau comme ci-dessous

create table mutable
(
    name varchar(64) default NULL,
    address varchar(512) default NULL
)

Ensuite, essayez d'utiliser la commande select de votre déchargement comme ci-dessous pour ajouter également des en-têtes

( select 'name','address') union ( select name,address from mytable )

cela ajoutera le nom et l'adresse des en-têtes comme première ligne dans votre sortie.

12
Sandesh Deshmane

Si l'une de vos colonnes ne contient pas de caractère, vous devez les convertir explicitement en char ou en varchar car l'UNION force une conversion.

Voici un exemple de l'instruction complète qui créera un fichier dans S3 avec les en-têtes de la première ligne.

Le fichier de sortie sera un fichier CSV unique avec des guillemets.

Cet exemple suppose des valeurs numériques dans la colonne_1. Vous devrez ajuster la clause ORDER BY sur une colonne numérique pour vous assurer que la ligne d'en-tête se trouve dans la ligne 1 du fichier S3.

    ******************************************

    /* Redshift export to S3 CSV single file with headers - limit 6.2GB */

    UNLOAD ('

        SELECT \'column_1\',\'column_2\'

      UNION 

        SELECT 


          CAST(column_1 AS varchar(255)) AS column_1,
          CAST(column_2 AS varchar(255)) AS column_2


        FROM source_table_for_export_to_s3 


      ORDER BY 1 DESC

      ;



    ')

    TO 's3://bucket/path/file_name_for_table_export_in_s3_' credentials
     'aws_access_key_id=<key_with_no_<>_brackets>;aws_secret_access_key=<secret_access_key_with_no_<>_brackets>' 


    PARALLEL OFF 


    ESCAPE


    ADDQUOTES


    DELIMITER ','


    ALLOWOVERWRITE


    GZIP


    ;


    ****************************************
25
Douglas Hackney

Depuis la version de cluster 1.0.3945, Redshift prend désormais en charge le déchargement des données vers S3 avec des lignes d'en-tête dans chaque fichier, c'est-à-dire.

UNLOAD('select column1, column2 from mytable;')
TO 's3://bucket/prefix/'
IAM_ROLE '<role arn>'
HEADER;

Remarque: vous ne pouvez pas utiliser l'option HEADER en conjonction avec FIXEDWIDTH.

https://docs.aws.Amazon.com/redshift/latest/dg/r_UNLOAD.html

19
fez

Juste pour compléter la réponse, pour vous assurer que la ligne d'en-tête vient en premier, vous n'avez pas besoin de trier par une colonne de données spécifique. Vous pouvez inclure les sélections UNIONed dans une autre sélection, leur ajouter une colonne ordinale, puis dans l'ordre de sélection externe par cette colonne sans l'inclure dans la liste des colonnes sélectionnées.

UNLOAD ('

  SELECT column_1, column_2 FROM (

     SELECT 1 AS i,\'column_1\' AS column_, \'column_2\' AS column_2
     UNION ALL
     SELECT 2 AS i, column_1::varchar(255), column_2::varchar(255)
     FROM source_table_for_export_to_s3

  ) t ORDER BY i

')
TO 's3://bucket/path/file_name_for_table_export_in_s3_'

CREDENTIALS
 'aws_access_key_id=...;aws_secret_access_key=...' 

DELIMITER ','
PARALLEL OFF 
ESCAPE
ADDQUOTES;
12
Kamran

Redshift prend désormais en charge le déchargement avec des en-têtes. version du 19 septembre au 10 octobre 2018 .

La syntaxe de déchargement avec des en-têtes est -

UNLOAD ('select-statement')
TO 's3: // chemin-objet/préfixe-nom'
autorisation
[~ # ~] en-tête [~ # ~]

7
santhosh

Essayez comme ceci:

Déchargez VENUE avec un en-tête:

unload ('select * from venue where venueseats > 75000')
to 's3://mybucket/unload/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
header
parallel off;

Ce qui suit montre le contenu du fichier de sortie avec une ligne d'en-tête:

venueid|venuename|venuecity|venuestate|venueseats
6|New York Giants Stadium|East Rutherford|NJ|80242
78|INVESCO Field|Denver|CO|76125
83|FedExField|Landover|MD|91704
79|Arrowhead Stadium|Kansas City|MO|79451
2
karthik G

Malheureusement, la commande UNLOAD ne prend pas en charge cette fonctionnalité en mode natif (voir les autres réponses pour savoir comment le faire avec des solutions de contournement).

J'ai posté une demande de fonctionnalité sur les forums AWS , donc j'espère qu'elle sera ajoutée un jour.

Edit:La fonctionnalité a maintenant été implémentée nativement dans Redshift ! ????

2
Marco Roy

Pour faciliter le processus, vous pouvez utiliser une image de docker prédéfinie pour extraire et inclure la ligne d'en-tête.

https://github.com/openbridge/ob_redshift_unload

Il fera également quelques autres choses, mais il semblait logique de l'empaqueter dans un format facile à utiliser.

1
Thomas Spicer

Pour décharger une table au format csv vers s3, y compris les en-têtes, vous devrez simplement le faire de cette façon

UNLOAD ('SELECT * FROM {schema}.{table}')
        TO 's3://{s3_bucket}/{s3_key}/{table}/'
        with credentials
        'aws_access_key_id={access_key};aws_secret_access_key={secret_key}'
        CSV HEADER ALLOWOVERWRITE PARALLEL OFF;
0
sambeth