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.
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.
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
;
****************************************
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
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;
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 [~ # ~]
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
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 ! ????
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.
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;