Amazon RedShift で巨大なデータセットの集計を行い、MySQL には比較的少量のデータがあります。RedShift の一部の結合では、MySQL のデータが必要です。MySql データを RedShift に同期する最良の方法は何ですか? オラクルのリモートビューのようなものは赤方偏移にありますか? または、プログラムで MySql にクエリを実行し、RedShift で挿入/更新する必要がありますか?
4 に答える
Redshift での結合に MySQL データが必要な場合、通常はデータを一方から他方に送信するだけです。
これは次のことを意味します。
- Redshift: 類似のテーブル スキーマの作成 (Redshift/PSQL の特殊性を念頭に置いて)
- MySQL: データ テーブルのダンプ (csv 形式)
- エクスポートを圧縮して S3 に送信する
- Redshift: テーブルを切り捨て、COPY を使用してすべてのデータをインポートする
ステップ 2 から 4 はスクリプト化でき、必要に応じて、または定期的に Redshift に新しいデータを送信できます。
オラクルの「リモートビュー」とは何ですか?
とにかく、テーブルから 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 に Mysql データをロードするこの最も簡単な方法を確認してください。最初のデータ スナップショットを redshift にロードするだけの場合は、その無料のソリューションを試してください。さらに、スキーマの移行、サイド バイ サイド クエリ コンソール、およびロード プロセス全体の統計レポート (グラフ付き) が得られます。