DEA / ドメイン2 データストア管理
重要な内容
Redshift へのロードとアンロード
の性能は、データをどう入れて、どう出すかで大きく変わります。 では、 から で並列にロードし、 で S3 へ並列に書き出すのが基本です。DEA-C01 では、S3 と Redshift の間のロードとアンロード (スキル 2.3.1) を中心に、COPY の速くする工夫、S3 からの自動コピー、・ からのストリーミング取り込み、ステージングテーブルと による upsert が問われます。
Point
- COPY: S3 などのファイルを Redshift のテーブルへ並列に読み込む SQL コマンドです。
- UNLOAD: クエリの結果を S3 へ並列に書き出す SQL コマンドです。
- upsert = update + insert です。キーが既にあれば更新し、なければ挿入します。
概要
| 方法 | 向くケース |
|---|---|
| のファイルを一括でロードする (最も速く、推奨の方法) | |
| S3 からの自動コピー (COPY JOB) | S3 に届くファイルを、パイプラインを作らずに自動でロードし続ける |
| ストリーミング取り込み | や のデータを、S3 を経由せず秒〜分の遅れで取り込む |
| 統合 | ・・ などの運用データを自動で複製する (「 (CDC) と zero-ETL」の章) |
| INSERT INTO … SELECT | 内や の外部テーブルからテーブルへ移す |
| 1行ずつの INSERT | 少量のだけ。大量のロードには使わない |
| 結果を S3 へ書き出して、他のサービスと共有・する |
主要技術
①COPY コマンド ⚠️ 頻出
COPY sales
FROM 's3://lake/curated/sales/2026/10/17/'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftLoadRole'
FORMAT AS PARQUET;
| 要素 | 内容 |
|---|---|
| 認可 | クラスターまたは Serverless の名前空間に関連付けた ロールを IAM_ROLE で指定する。を に書かない |
| 読み込み元 | (最も一般的)、、、 で接続するリモートホスト |
| 形式 | CSV、区切り文字、固定長、、、、。圧縮 (gzip、bzip2、zstd など) を読める |
| エラーの扱い | MAXERROR で許す不良行の数を決める。失敗の内容は STL_LOAD_ERRORS / SYS_LOAD_ERROR_DETAIL で調べる |
| 統計と圧縮 | 空のテーブルへの初回ロードでは、圧縮エンコーディングと統計を自動で設定できる |
は、ファイルを各スライスへ割り当てて並列に読みます。速くするには次のようにします。
| 工夫 | 理由 |
|---|---|
| 1つの大きなファイルを、スライス数の倍数の個数に分ける | 1ファイルは1スライスしか読めない。分けると全スライスが同時に働く |
| 分けたファイルの大きさをそろえる (圧縮後に 1 MB〜1 GB 程度) | 遅いスライスに全体が引きずられない |
| ファイルを圧縮する、列指向形式にする | 読む量が減る |
| 1回の COPY でまとめて読む (テーブルごとに1つの COPY) | 小さな COPY を何度も並べると遅く、コミットも増える |
DynamoDB から COPY するときは、テーブルの読み取り容量を消費するため、READRATIO で使う割合を抑えるか、DynamoDB を S3 へエクスポートしてから COPY します。
②マニフェストファイル
マニフェストは、ロードするファイルの一覧を で明示するファイルです。
| 使いどころ | 理由 |
|---|---|
| プレフィックスの下にロードしてはいけないファイルが混じる | 一覧にあるファイルだけを読む |
| 必ずすべてのファイルを読み込みたい | mandatory: true を付けると、ファイルが見つからないとき が失敗する |
| 別のにあるファイルをまとめて読む | 複数の場所を1回の COPY で読める |
のプレフィックスを指定するだけの COPY は、同じプレフィックスで始まる別のファイル (例: sales_backup) まで読んでしまうことがあります。正確にロードしたいときはマニフェストを使います。
③S3 からの自動コピー (COPY JOB)
イベント統合を作り、 に JOB CREATE ... AUTO ON を付けると、S3 の指定したパスに新しいファイルが届くたびに が自動で COPY を実行します。
COPY public.orders
FROM 's3://lake/landing/orders/'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftLoadRole'
FORMAT AS CSV
JOB CREATE orders_autocopy
AUTO ON;
| 特徴 | 内容 |
|---|---|
| 重複の防止 | どのファイルをロード済みかを Redshift が記録し、同じファイルを二度読まない |
| 前提 | S3 と Redshift が同じ。バケットポリシー、Redshift のリソースポリシー、 ロールの許可が必要 |
| 監視 | SYS_COPY_JOB、SYS_COPY_JOB_DETAIL、SYS_LOAD_ERROR_DETAIL で状況とエラーを見る |
| 制約 | 送信元バケットに、オブジェクト作成の既存のイベント通知があると作れない |
や でロードの仕組みを作らずに、届いたファイルを継続的にロードしたいときに選びます。
④ストリーミング取り込み ⚠️ 頻出
自身が や のコンシューマーとなり、レコードをへ直接取り込みます。 のような一時的な置き場を挟みません。
CREATE EXTERNAL SCHEMA kds
FROM KINESIS
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftStreamRole';
CREATE MATERIALIZED VIEW clicks_mv AUTO REFRESH YES AS
SELECT approximate_arrival_timestamp,
JSON_PARSE(kinesis_data) AS payload
FROM kds."click-stream";
| 注意点 | 内容 |
|---|---|
| 自動更新 | AUTO REFRESH YES を指定すると、届いたデータを継続的に取り込む (既定は手動更新) |
| の扱い | 列ごとに JSON_EXTRACT_PATH_TEXT で取り出すと遅い。JSON_PARSE で SUPER 型にしてから PartiQL で取り出す |
| 1つのストリームに1つのビュー | 同じストリームに複数のビューを作ると、それぞれがコンシューマーになりと費用が増える |
| 結合 | ストリーミング用のビューでは結合できない。別のビューやテーブルで結合する |
| 一度だけの処理 | シーケンス番号やオフセットで、各レコードを一度だけ取り込む |
| 圧縮 | 圧縮されたレコードは扱えない。送る前に展開する |
で S3 へ書いてから する構成より、遅れが小さく、部品も少なくなります。
⑤ステージングテーブルと MERGE による upsert ⚠️ 頻出
には主キーの一意性を強制する仕組みがありません (主キーは宣言できますが、重複は防げません)。同じデータを二度ロードすると、行が重複します。差分データを反映するときは、いったんステージングテーブルにロードしてから します。
BEGIN;
CREATE TEMP TABLE stage (LIKE customers);
COPY stage FROM 's3://lake/cdc/customers/2026-10-17/'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftLoadRole'
FORMAT AS PARQUET;
MERGE INTO customers
USING stage s ON customers.customer_id = s.customer_id
WHEN MATCHED THEN UPDATE SET name = s.name, email = s.email
WHEN NOT MATCHED THEN INSERT VALUES (s.customer_id, s.name, s.email);
END;
MERGE を使わない場合は、同じトランザクションの中で「ステージングにあるキーを本番から DELETE → ステージングから INSERT」を行います。トランザクションにすると、途中の状態が他のクエリから見えません。
⑥UNLOAD コマンド
UNLOAD ('SELECT * FROM sales WHERE sale_date < ''2025-01-01''')
TO 's3://lake/archive/sales/'
IAM_ROLE 'arn:aws:iam::111122223333:role/RedshiftUnloadRole'
FORMAT AS PARQUET
PARTITION BY (sale_year);
| オプション | 内容 |
|---|---|
| FORMAT AS PARQUET / CSV / | 既定はパイプ区切りのテキスト。 はテキストより書き出しが速く、 の容量も小さい |
| PARTITION BY | Hive 形式 (sale_year=2024/) のフォルダに分けて書き出す |
| PARALLEL | 既定は ON。スライスごとに並列でファイルを書く。OFF にすると1つずつ順に書く |
| MAXFILESIZE | 1ファイルの最大サイズ (5 MB〜6.2 GB、既定 6.2 GB) |
| MANIFEST | 書き出したファイルの一覧を作る |
| 暗号化 | 既定で 。_KEY_ID と ENCRYPTED で |
| ALLOWOVERWRITE / CLEANPATH | 既存のファイルを上書きする / 書き出す前に消す |
はカタログへ登録しません。書き出したデータを や から読むには、を実行するか、ALTER TABLE ADD PARTITION で登録します。古いデータを UNLOAD で S3 へ移し、Spectrum の外部テーブルとして読み続ける構成は、 のストレージを減らす定石です。
試験対策
①判断マトリクス
| 問題文のキーワード | 選ぶもの |
|---|---|
| の大量ファイルを最速でロード | (ファイルを分割し、スライス数の倍数・同じ大きさに) |
| 1つの巨大な CSV のロードが遅い | ファイルを分割して圧縮する |
| 特定のファイルだけ、または全ファイルを確実にロード | マニフェストファイル |
| S3 に届くファイルを仕組みなしで自動ロード | S3 イベント統合 + COPY JOB (自動コピー) |
| / のデータを数秒〜数分で分析 | ストリーミング取り込み () |
| 差分データで既存の行を更新・挿入 | ステージングテーブル + |
| 同じファイルを二度ロードして重複した | 主キーは強制されない。ステージング + MERGE、自動コピーの重複防止 |
| 結果を他のサービスと共有、古いデータを | (、PARTITION BY) |
| COPY の失敗の原因を調べる | STL_LOAD_ERRORS / SYS_LOAD_ERROR_DETAIL |
| の本番テーブルに負荷をかけたくない | S3 へエクスポートしてから COPY、または READRATIO |
②よくある誤答
- 大量のデータを INSERT 文で1行ずつ入れること。遅く、 を使います。
- COPY の認証にを使うこと。 ロールを関連付けて IAM_ROLE で指定します。
- 主キーを宣言すれば重複が防げると考えること。 は一意性を強制しません。
- すれば からすぐ読めると考えること。カタログへの登録が別に必要です。
- ストリーミング取り込みで、1つのストリームに用途ごとのビューをいくつも作ること。と費用が増えます。