web-dev-qa-db-ja.com

ヘッダー付きのredshiftからs3へのアンロード

私はすでに、ファイルをredshiftからs3に1つのファイルとしてアンロードする方法を知っています。列ヘッダーでアンロードする方法を知る必要があります。誰でも助けてくれたり、手がかりを教えてもらえますか?

シェルまたはpythonで手動で行う必要はありません。

27
Tokunbo Hiamang

Redshift unloadによって提供される直接的なオプションはありません。

ただし、クエリを微調整して、ヘッダーが追加された行を持つファイルを生成できます。

最初に、ファイルのみで作成されるように、パラレルオフオプションを試します。

「デフォルトでは、UNLO​​ADはクラスター内のスライス数に応じて複数のファイルにデータを並行して書き込みます。デフォルトのオプションはONまたはTRUEです。データファイルの最大サイズは6.2 GBです。たとえば、13.4 GBのデータをアンロードすると、UNLO​​ADは次の3つのファイルを作成します。」

アンロードファイルにヘッダーを含めるには、次のようにします。

次のような表があるとします

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

次に、以下のようにアンロードする選択コマンドを使用して、ヘッダーも追加してみてください

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

これにより、ヘッダー名とアドレスが出力の最初の行として追加されます。

12

列のいずれかが文字でない場合は、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


    ;


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

クラスターバージョン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

19
fez

答えを補足するために、ヘッダー行が最初に来るようにするために、データの特定の列で並べ替える必要はありません。 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;
12
Kamran

Redshiftはヘッダー付きのアンロードをサポートするようになりました。 2018年9月19日〜10月10日リリース

ヘッダーを使用してアンロードするための構文は-

UNLOAD(「選択ステートメント」)
TO 's3:// object-path/name-prefix'
承認
[〜#〜] header [〜#〜]

7
santhosh

このようにしてみてください:

ヘッダー付きの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
2
karthik G

残念ながら、UNLOADコマンドはこの機能をネイティブにサポートしていません(回避策を使用して行う方法については、他の回答を参照してください)。

AWSフォーラムに機能リクエストを投稿しました なので、いつか追加されることを願っています。

Edit:この機能はRedshiftでネイティブに実装されました ! ????

2
Marco Roy

プロセスを簡単にするために、事前に構築されたドッカー画像を使用して、ヘッダー行を抽出して含めることができます。

https://github.com/openbridge/ob_redshift_unload

また、他にもいくつかのことを行いますが、これを使いやすい形式でパッケージ化することは理にかなっているようです。

1
Thomas Spicer

ヘッダーを含む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;
0
sambeth