■ はじめに
Hiveテーブルデータ を Redshift に移行することをやったので ざっくり方針などをメモ。
目次
【1】Hiveテーブルデータ を Redshift に移行するには 1)移行手順案 2)トラブルについて 【2】サンプル 1)HiveのExternal TableでS3上に保存する 2)RedshiftのCOPYコマンドでデータ移行 【3】使用上の注意 【4】その他技術事項 1)日付・日時変換
【1】Hiveテーブルデータ を Redshift に移行するには
* 色々な方法があるかもしれないが、 方針案は、以下の通り。 => なお、RedshiftのCOPY コマンドは、以下の関連記事を参照のこと。
Amazon Redshift ~ COPY コマンド ~
https://dk521123.hatenablog.com/entry/2021/07/21/214248
1)移行手順案
1)HiveのExternal Tableで一旦S3上に保存する ... [Hive part] 2)RedshiftのCOPYコマンドで1)のデータ移行 ... [Redshift part]
2)トラブルについて
* 以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2021/09/03/134359
【2】サンプル
1)HiveのExternal TableでS3上に保存する
* HiveのExternal Tableで一旦S3上に保存する
Hive part
-- GZIP形式で圧縮する set hive.exec.compress.output=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; use sample_db; DROP TABLE IF NOT EXISTS sample_table; CRATE EXTERNAL TABLE sample_table( id STRING, name STRING, col1 STRING, col2 STRING, created_at TIMESTAMP ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' STORED AS TEXTFILE LOCATION 's3://your-s3-bucket/xxxx/sample_db/sample_table/' ; -- SELECT 移行は各々移行したいデータを指定。 -- 今回は、テスト用なのでダミーデータ。 INSERT OVERWRITE TABLE sample_table SELECT 'x0001' AS sample_id , 'Mike' AS name , 'Hello' AS col1 , 'World' AS col2 , CURRENT_TIMESTAMP AS created_at FROM (SELECT 'dummy') dummy; -- 後の処理に影響しないように元の設定に戻しておく set hive.exec.compress.output=false;
2)RedshiftのCOPYコマンドでデータ移行
* RedshiftのCOPYコマンドで1)のデータ移行
Redshift part
-- COPYコマンド(当たり前だが、S3は同じパスを指定) COPY redshift_db_name.redshift_sample_table FROM 's3://your-s3-bucket/xxxx/sample_db/sample_table/' iam_role 'arn:aws:iam::XXXXXXXXXXX:role/for-redshift-role' DELIMITER '\001' gzip NULL 'NULL' REGION 'us-west-2';
【3】使用上の注意
1)Hiveテーブル定義とRedshiftテーブル定義は揃えておく => 以下の関連記事で行ったIDENTITY で指定したIDも飛ばせなかった => 回避策は、探せばあるかもしれませんが、、、
Amazon Redshift ~ 自動採番 / IDENTITY ~
https://dk521123.hatenablog.com/entry/2021/08/31/194134
* その他注意事項は、以下の公式サイトを参照。
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_COPY_usage_notes.html
【4】その他技術事項
1)日付・日時変換
* 一般的なものであれば自動的に変換してくれる => 明示的に変換したい場合は、以下のように「dateformat 'xxxx'」。
=> 以下のサイトも今後参考になるかも、、、
https://dev.classmethod.jp/articles/how-to-load-invalid-date-format-to-redshift/
dateformat 使用例1
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/automatic-recognition.html
-- より抜粋 copy favoritemovies from 'dynamodb://ProductCatalog' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' dateformat 'auto';
dateformat 使用例2:フォーマット指定
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html
-- より抜粋 ... 略 ... DATEFORMAT AS 'MM/DD/YYYY'; -- 03/31/2003 ... 略 ... TIMEFORMAT AS 'MM.DD.YYYY HH:MI:SS'; -- 03.31.2003 18:45:05.123456
関連記事
Amazon Redshift ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/22/002139
Amazon Redshift ~ COPY コマンド ~
https://dk521123.hatenablog.com/entry/2021/07/21/214248
Hiveテーブルデータ を Redshift に移行時のCOPYコマンドエラー
https://dk521123.hatenablog.com/entry/2021/09/03/134359
Amazon Redshift ~ 自動採番 / IDENTITY ~
https://dk521123.hatenablog.com/entry/2021/08/31/194134
Hive / HiveQL ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/25/231235
Hive / HiveQL ~ HiveQL関数 / 日時・日付操作編 ~
https://dk521123.hatenablog.com/entry/2021/02/11/233633
Hive で固定値を挿入するには
https://dk521123.hatenablog.com/entry/2020/09/22/000000
Hive / HiveQL ~ データ圧縮あれこれ ~
https://dk521123.hatenablog.com/entry/2021/08/06/172502