一部の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ファイルの形式に制限があるかどうかはわかりませんが、ドキュメントでは見つかりません。
誰でも手伝ってくれる?
問題は最終的に以下を使用して解決されます:
'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
現在、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オプションを使用する必要があります。
詳細については、次のリンクを参照してください。
これで試すことができます
'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]
いくつかのコードを保存したい場合/ Amazon Data Pipelineを使用できる非常に基本的なユースケースがあります。それはスポットインスタンスを統計し、Amazonネットワーク内で変換を実行し、それは本当に直感的なツールです(しかし非常にシンプルなので、それで複雑なことを行うことはできません)
ローカルファイルをREDSHIFTテーブルにロードしようとしているようです。 COPYコマンドを機能させるには、CSVファイルをS3に置く必要があります。
テーブルからCSVファイルにデータを抽出できる場合、もう1つのスクリプトオプションがあります。 Python/boto/psycopg2コンボを使用して、CSVロードをAmazon Redshiftにスクリプト化できます。
私の MySQL_To_Redshift_Loader では、次のようにします。
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)
...
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 )
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)
解決策はすでに提供されているので、明白なことは繰り返さない。
ただし、理解できないエラーがさらに発生した場合は、Redshiftアカウントのいずれかに接続しているときにワークベンチで実行してください。
select * from stl_load_errors [where ...];
stl_load_errorsには、通常のユーザーは自分のアカウントに対応する詳細を表示できますが、スーパーユーザーはすべてのアクセス権を持つことができる、履歴形式のすべてのAmazon RSロードエラーが含まれています。
詳細は、次の場所に詳細に記載されています。 Amazon STL Load Errors Documentation
コメントに少し遅れますが、それは役に立つかもしれません:-
オープンソースプロジェクトを使用して、テーブルをmysqlからredshift- sqlshift に直接コピーできます。
sparkが必要なだけで、糸があればそれも使用できます。
利点:-主キーを使用してdistkeyおよびinterleaved sortkeyを自動的に決定します。