18

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

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

手順 3 でエラーが発生します。

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

copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' csv;

エラー情報:

SQL コマンドの実行中にエラーが発生しました: copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx エラー: COPY CSV はサポートされていません [SQL 状態 = 0A000] 実行時間: 0.53 秒1 件のステートメントが失敗しました。

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

誰でも助けることができますか?

4

8 に答える 8

16

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

copy TABLE_A from 's3://ciphor/TABLE_A.csv' CREDENTIALS 'aws_access_key_id=xxxx;aws_secret_access_key=xxxx' delimiter ',' removequotes;

詳細については、http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.htmlを参照してください。

于 2013-03-13T04:10:08.777 に答える
1

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

于 2013-08-11T12:21:51.210 に答える
1

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

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

CSV 自体はカンマ区切りの値を意味し、これに区切り記号を付ける必要はありません。リンクを参照してください。

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

于 2016-07-22T12:33:28.240 に答える
0

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

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

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

利点: - 主キーを使用して、 distkeyインターリーブソートキーを自動的に決定します。

于 2017-01-11T08:37:33.993 に答える
0

ローカル ファイルを 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)
    
于 2016-12-23T15:34:25.520 に答える
0

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

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

select * from stl_load_errors [where ...];

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

詳細は、 Amazon STL Load Errors Documentationで精巧にキャプチャされています。

于 2016-12-24T10:55:34.950 に答える