私はすでに、ファイルをredshiftからs3に1つのファイルとしてアンロードする方法を知っています。列ヘッダーでアンロードする方法を知る必要があります。誰でも助けてくれたり、手がかりを教えてもらえますか?
シェルまたはpythonで手動で行う必要はありません。
Redshift unloadによって提供される直接的なオプションはありません。
ただし、クエリを微調整して、ヘッダーが追加された行を持つファイルを生成できます。
最初に、ファイルのみで作成されるように、パラレルオフオプションを試します。
「デフォルトでは、UNLOADはクラスター内のスライス数に応じて複数のファイルにデータを並行して書き込みます。デフォルトのオプションはONまたはTRUEです。データファイルの最大サイズは6.2 GBです。たとえば、13.4 GBのデータをアンロードすると、UNLOADは次の3つのファイルを作成します。」
アンロードファイルにヘッダーを含めるには、次のようにします。
次のような表があるとします
create table mutable
(
name varchar(64) default NULL,
address varchar(512) default NULL
)
次に、以下のようにアンロードする選択コマンドを使用して、ヘッダーも追加してみてください
( select 'name','address') union ( select name,address from mytable )
これにより、ヘッダー名とアドレスが出力の最初の行として追加されます。
列のいずれかが文字でない場合は、UNIONがキャストを強制するため、charまたはvarcharとして明示的にキャストする必要があります。
最初の行にヘッダーを持つファイルをS3で作成する完全なステートメントの例を次に示します。
出力ファイルは、引用符付きの単一のCSVファイルになります。
この例では、column_1の数値を想定しています。 ORDER BY句を数値列に調整して、ヘッダー行がS3ファイルの行1にあることを確認する必要があります。
******************************************
/* 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
;
****************************************
クラスターバージョン1.0.3945の時点で、Redshiftは各ファイルのヘッダー行を使用したS3へのデータのアンロードをサポートするようになりました。
UNLOAD('select column1, column2 from mytable;')
TO 's3://bucket/prefix/'
IAM_ROLE '<role arn>'
HEADER;
注:HEADER
オプションと一緒にFIXEDWIDTH
オプションを使用することはできません。
https://docs.aws.Amazon.com/redshift/latest/dg/r_UNLOAD.html
答えを補足するために、ヘッダー行が最初に来るようにするために、データの特定の列で並べ替える必要はありません。 UNIONされた選択を別の選択内に囲み、それらに順序列を追加し、選択した列のリストに含めずに、その列の外側の選択順序で追加できます。
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はヘッダー付きのアンロードをサポートするようになりました。 2018年9月19日〜10月10日リリース 。
ヘッダーを使用してアンロードするための構文は-
UNLOAD(「選択ステートメント」)
TO 's3:// object-path/name-prefix'
承認
[〜#〜] header [〜#〜]
このようにしてみてください:
ヘッダー付きのVENUEをアンロードします。
unload ('select * from venue where venueseats > 75000')
to 's3://mybucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
header
parallel off;
以下に、ヘッダー行を含む出力ファイルの内容を示します。
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
残念ながら、UNLOAD
コマンドはこの機能をネイティブにサポートしていません(回避策を使用して行う方法については、他の回答を参照してください)。
AWSフォーラムに機能リクエストを投稿しました なので、いつか追加されることを願っています。
Edit:この機能はRedshiftでネイティブに実装されました ! ????
プロセスを簡単にするために、事前に構築されたドッカー画像を使用して、ヘッダー行を抽出して含めることができます。
https://github.com/openbridge/ob_redshift_unload
また、他にもいくつかのことを行いますが、これを使いやすい形式でパッケージ化することは理にかなっているようです。
ヘッダーを含むs3にcsvとしてテーブルをアンロードするには、単にこのようにする必要があります
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;