web-dev-qa-db-ja.com

csvデータファイルをAmazon RedShiftにコピーする方法

一部のMySQLテーブルをAmazon Redshiftに移行しようとしていますが、いくつかの問題が発生しました。

手順は簡単です:1. MySQLテーブルをcsvファイルにダンプします2. csvファイルをS3にアップロードします3.データファイルをRedShiftにコピーします

ステップ3でエラーが発生します。

SQLコマンドは次のとおりです。

's3://ciphor/TABLE_A.csv'からTABLE_AをコピーしますCREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' delimiter '、' csv;

エラー情報:

SQLコマンドの実行中にエラーが発生しました: 's3://ciphor/TABLE_A.csv'からTABLE_AをコピーしてくださいCREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx ERROR:COPY CSV is not supported [SQL State = 0A000]実行時間:0.53s 1つのステートメントが失敗しました。

区切り文字や引用符など、csvファイルの形式に制限があるかどうかはわかりませんが、ドキュメントでは見つかりません。

誰でも手伝ってくれる?

15
ciphor

問題は最終的に以下を使用して解決されます:

's3://ciphor/TABLE_A.csv'からTABLE_AをコピーしますCREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' delimiter '、' removequotes;

詳細はこちら http://docs.aws.Amazon.com/redshift/latest/dg/r_COPY.html

15
ciphor

現在、Amazon RedshiftはCOPYコマンドのCSVオプションをサポートしています。 CSV形式のデータを正しくインポートするには、このオプションを使用することをお勧めします。以下にフォーマットを示します。

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

デフォルトの区切り文字は(、)で、デフォルトの引用符は( ")です。また、このようにCSVおよびDELIMITERオプションを使用してTSV形式のデータをインポートできます。

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';

REMOVEQUOTESが新しい行または区切り文字を囲まれたフィールド内に持つことをサポートしていない古い方法(DELIMITERおよびREMOVEQUOTES)を使用することには、いくつかの欠点があります。データにこの種の文字を含めることができる場合は、CSVオプションを使用する必要があります。

詳細については、次のリンクを参照してください。

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

9

これで試すことができます

's3://ciphor/TABLE_A.csv'からTABLE_AをコピーしますCREDENTIALS 'aws_access_key_id = xxxx; aws_secret_access_key = xxxx' csv;

CSV自体はカンマ区切りの値を意味し、区切り文字を指定する必要はありません。リンクを参照してください。

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

1
Dipesh Palod

いくつかのコードを保存したい場合/ Amazon Data Pipelineを使用できる非常に基本的なユースケースがあります。それはスポットインスタンスを統計し、Amazonネットワーク内で変換を実行し、それは本当に直感的なツールです(しかし非常にシンプルなので、それで複雑なことを行うことはできません)

1
asafm

ローカルファイルをREDSHIFTテーブルにロードしようとしているようです。 COPYコマンドを機能させるには、CSVファイルをS3に置く必要があります。

テーブルからCSVファイルにデータを抽出できる場合、もう1つのスクリプトオプションがあります。 Python/boto/psycopg2コンボを使用して、CSVロードをAmazon Redshiftにスクリプト化できます。

私の MySQL_To_Redshift_Loader では、次のようにします。

  1. MySQLから一時ファイルにデータを抽出します。

    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. Boto Pythonモジュールとマルチパートアップロードを使用して、データを圧縮してS3にロードします。

    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. Psycopg2のCOPYコマンドを使用して、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

解決策はすでに提供されているので、明白なことは繰り返さない。

ただし、理解できないエラーがさらに発生した場合は、Redshiftアカウントのいずれかに接続しているときにワークベンチで実行してください。

select * from stl_load_errors [where ...];

stl_load_errorsには、通常のユーザーは自分のアカウントに対応する詳細を表示できますが、スーパーユーザーはすべてのアクセス権を持つことができる、履歴形式のすべてのAmazon RSロードエラーが含まれています。

詳細は、次の場所に詳細に記載されています。 Amazon STL Load Errors Documentation

0
Yusuf Hassan

コメントに少し遅れますが、それは役に立つかもしれません:-

オープンソースプロジェクトを使用して、テーブルをmysqlからredshift- sqlshift に直接コピーできます。

sparkが必要なだけで、糸があればそれも使用できます。

利点:-主キーを使用してdistkeyおよびinterleaved sortkeyを自動的に決定します。

0
Devavrata