【AWS】Hiveテーブルデータ を Redshift に移行するには

■ はじめに

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://docs.aws.amazon.com/ja_jp/redshift/latest/dg/copy-parameters-data-conversion.html#copy-dateformat

 => 以下のサイトも今後参考になるかも、、、

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