Amazon Redshift DB開発者ガイド – データのロード処理(2).COPYコマンドの使用

Amazon Redshift DB開発者ガイド – データのロード処理(2).COPYコマンドの使用

Clock Icon2013.08.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

『データロードのベストプラクティス』に続くデータロードの処理、第2弾です。またもやかなり長〜くなってしまいましたが、リファレンス的にご利用頂ければと思います。m(_ _)m


COPYコマンドは、Amazon S3上のファイルから、又はDynamoDBのテーブルから並列にデータを読み込み、ロードするためにAmazon Redshiftの超並列処理(MPP)を活用しています。

注意:
大量データのロードの際はCOPYコマンドを使う事を我々は強くお奨めします。
個々にINSERT文を使用する場合、実行スピードはとてつもなく遅くなるかもしれません。
また、あなたのデータが他のAmazon Redshiftのデータベーステーブルに存在する場合は、
パフォーマンス向上の為にINSERT INTO … SELECT又はCREATE TABLE ASを使用します。
詳細については、INSERT 又は CREATE TABLE ASをご参照ください。

COPYコマンドを使用してテーブルにデータをロードする権限を付与または取り消す際は、INSERT権限を付与、または取り消す操作を行います。データは、Amazon Redshiftのテーブルにロードする為に適した形式である必要があります。このセクションでは、ロードを行う前にデータを準備し検証するための、そしてそれを実行する前にCOPY文を検証するためのガイドラインを示します。

ファイル内の情報を保護する為に、Amazon S3バケットにそれらをアップロードする前にデータファイルを暗号化する事が出来ます。COPYはデータの復号化を行い、データのロードを実行します。また、ファイルをアップロードする時間を節約する為にGZIPを使用してファイルを圧縮する事が出来ます。COPYは、それらが読み取られるように、ファイルを復号化する事により、ロードプロセスをスピードアップする事が出来ます。

ユーザーに一時的なセキュリティ証明書を提供する事により、データへのアクセス負荷を制限する事が出来ます。それら証明書の寿命は短いですし、期限が切れたあとはその証明書は再利用出来ません、ですので、一時的なセキュリティ証明書を用いる事は、強化されたセキュリティを提供する事になります。

AWSクラウド内のトランジットでデータを安全に保つ為に、COPYやUNLOAD、バックアップやリストア操作に対してAmazon RedshiftはAmazon S3やAmazon DynamoDBと共にハードウェアアクセラレーターSSLを用いています。

Amazon DynamoDBのテーブルから直接テーブルをロードする際、消費するAmazon DynamoDBのプロビジョニングされたスループットの量を制御するオプションがあります。必要に応じて、COPYは入力データを分析し、ロードプロセスの一環として対象のテーブルに対し自動的に最適な圧縮エンコーディングを適用させる事が出来ます。

目次


 

入力データの準備

もし入力データが(ロードの際に)テーブルの列に対応していない場合、COPYコマンドは失敗します。入力データが有効である事を確保する為に、以下のガイドラインを使用します。

  • データは、4バイト長のUTF-8文字を含める事が出来ます。
  • CHARやVARCHARの文字が対応する列の項目長よりも短い文字列長である事を確認します。VARCHAR列は文字数では無くバイト数で測られます。例えば、4バイトで構成される漢字4文字の文字列は、VARCHAR(16)の列を必要とします。
  • マルチバイト文字は、VARCHAR列でのみ対応が可能です。マルチバイト文字は1文字4バイト以上無い事を確認します。
  • CHAR列のデータについては、単一バイト文字で構成されている事を確認。
  • レコード内の最後のフィールドを示す為に特別な文字や構文を含めないでください。フィールドは区切り文字に成り得ます。
  • もしデータの中にNULLターミネーター、又はNUL(UTF8 0000)やバイナリゼロ(0x0000)が含まれている場合、これらの文字をNULLSとしてCHAR若しくはVACHAR列にロードする事が出来ます(その際はCOPYコマンドでNULL ASオプションを指定)。 もしこのケースでNULL ASを使わない場合、COPYコマンドは失敗します。
  • もし文字列にこのような区切り文字や埋め込み文字等の特殊文字が含まれている場合、COPYコマンドでESCAPEオプションを指定します。
  • すべての単一引用符と二重引用符が適切に一致していることを確認します。
  • 浮動小数点の文字列は、12.123のような標準浮動小数点形式、または1.0E4のような指数形式であることを確認します。
  • タイムスタンプ型文字列と日付型文字列がそれそれDATEFORMATTIMEFORMAT文字列の仕様に従っていることを確認します。TIMESTAMPのデフォルトの形式は、YYYY-MM-DD hh:mm:ss、DATEのデフォルトの形式は、YYYY-MM-DDです。
  • 個々のデータ型の境界と制限の詳細については、Data Typesをご参照ください。また、マルチバイト文字のエラー詳細については、Multi-byte character load errorsをご参照ください。

 

Amazon S3からのデータのロード / Loading data from Amazon S3

COPYコマンドはAmazon S3バケットから並列にデータを読み込み、ロードする為にAmazon Redshift超並列処理(MPP)を活用しています。

テーブルに分散キーを設定する事で、データを分割して複数のファイルにする事により並列処理を最大限活用する事が出来ます。分散キーの詳細については、Choosing a data distribution methodをご参照ください。

ファイルからのデータはターゲットとなるテーブルの行毎に1行ずつロードされます。データファイルのフィールドは、テーブルの列と順番(左→右)が一致しています。データファイル内のフィールドは固定幅または区切り文字であり、デフォルトの区切り文字はパイプ(|)です。

全てのテーブルの列は、デフォルトでロードされ、または必要に応じて列のカンマ区切りリストを定義する事が出来ます。テーブルの列がCOPYコマンドで指定された列のリストに含まれていない場合は、デフォルト値がロードされます。詳細については、Loading default column valuesをご参照ください。

Amazon S3からデータをロードするには、以下の一般的な手順に従ってください。

  • 1. 複数のファイルにデータを分割する
  • 2. Amazon S3にファイルをアップロードする
  • 3 .テーブルをロードする為にCOPYコマンドを実行する

データを復数ファイルに分割

ロードを行う際、単一のファイルからテーブルのデータをロードしたり、テーブルに対してデータを複数のファイルに分割してロードする事が出来ます。 COPYコマンドでは、もしファイル名が共通の接頭辞、またはプレフィックスキーをセットで共有していた場合、複数のファイルから並行してデータをロードする事が出来ます。

注意:
並列処理を活用する為に、我々は複数のファイルにデータを分割する事を強くお奨めします。

ファイルの数は、クラスタ内のスライス数の倍数になるようにデータを分割してください。そうする事で、Amazon Redshiftが均等にスライス間でデータを分割する事kが出来ます。例えば、XL計算ノードが各々2つのスライスを有しており、8XL計算ノードが各々16スライスを有しているとします。もしあなたが2つのXLノードを持っていた場合、データは計4つのファイルに分割すると良いでしょう。

ワークロードを分割する際に、そのファイルがほぼ同じサイズである事を確認してください。Amazon Redshiftはアカウントにファイルサイズを取りません。

共通の接頭辞で、各ファイルに名前を付けます。例えば、以下のようにvenue.txtファイルは、4つのファイルに分割される場合があります。

venue.txt.1
venue.txt.2
venue.txt.3
venue.txt.4

ファイルのアップロード

ファイルを分割後は、それらをバケットにアップロード出来ます。必要に応じてファイルを暗号化し、それらをロードする前にファイルを圧縮する事が出来ます。

データファイルを保持する為にAmazon S3のバケットを作成し、次にバケットにファイルをアップロードします。バケットとアップロードファイルの作成については、Amazon S3 Derveloper GuideのWorking with Amazon S3 Bucketsをご参照ください。

重要:
データファイルを保持しているAmazon S3のバケットは、クラスタと同じリージョン内に作成する必要があります。

もしあなたが米国東部(N. Virginia)でクラスタを作成した場合、バケットも同様に米国東部(N. Virginia)を指定し、くれぐれも米国標準地域を選択しないようにしてください。 Amazon S3は自動的にヴァージニア州北部や太平洋岸北西部の施設に米国標準地域を指定して要求をルーティングします。なのであなたがもし米国標準地域を指定した場合、あなたのデータが指定のクラスタに配置されていない可能性があります。Amazon S3バケットを作成する時に、データの遅延を最小限に抑える為に、名前のエンドポイントを使います。

米国東部地域の名前が付いたエンドポイントを使用するには、AmazonのS3にアクセスするために使用しているホスト名を置き換えます。たとえば、次の文字列を置き換えます。

http://mybucket.s3.amazonaws.com/somekey.ext

変更後の内容はこちら。

http://mybucket.s3-external-1.amazonaws.com/somekey.ext

Amazon S3の領域への詳細については、Buckets and Regionsをご参照ください。

暗号化データのアップロード

クライアント側の暗号化を使用してAmazon S3のバケットにデータをアップロードする事が出来ます。その後、安全に暗号化オプションとプライベート暗号化キーでCOPYコマンドを使用してデータをロードします。

暗号化については、エンベロープの暗号化を使用します。エンベロープの暗号化を使用すると、アプリケーションは排他的に全ての暗号化を処理します。

あなたの秘密暗号鍵と暗号化されていないデータは決してAWSには送信されません。なのであなたが安全に暗号化キーを管理する事はとても重要なのです。暗号化キーを紛失した場合、データを復号化する事は出来ません、AWSから暗号化キーを回復する事は出来ないのです。

エンベロープの暗号化は、非対称鍵が提供するセキュアな鍵管理を維持しながら、高速対象暗号化のパフォーマンスを兼ね備えています。

ワンタイム仕様対象キー(エンベロープ対象鍵)はデータを暗号化する為にAmazon S3の暗号化クライアントによって生成され、そのキーはマスターキーで暗号化されており、Amazon S3にデータと一緒に保存されます。Amazon Redshiftがロード時にデータアクセスすると、暗号化された対称キーは実際のキーを使用して取得し、データは復号化されます。

以下は、Amazon S3に暗号化されたファイルをアップロードする為の手順です。

  • 1.ワンタイム(1回限りで使用可能)のエンベロープ対称鍵を生成します。
  • 2.このエンベロープキーを使用してファイルデータを暗号化します。
  • 3.マスター公開鍵または対称鍵を使用してエンベロープキーを暗号化します。
  • 4.暗号化されたファイルと共に、暗号化されたエンベロープのキーを保管してください。
  • 5.暗号化に使用されるキーを一意識別するために、エンベロープキーと一緒にマスターキー(の記述)を保管します。

クライアントの暗号化の設定をする場合は、以下のガイドラインに従ってください。

  • 対称暗号化メカニズムを使用
  • AWS S3暗号化クライアントに対し、256bitのAES対称キーを提供
  • オブジェクトのメタデータストレージモードを使用

Amazon S3に暗号化されたファイルをアップロードする方法の詳細については、Using Client-Side Encryptionをご参照ください。COPYコマンドを使用してAmazon Redshiftに暗号化されたファイルをロードする為の手順については、Loading encrypted data files from Amazon S3をご参照ください。

COPYコマンドの利用

Amazon S3上のデータファイルから、並行してテーブルをロードするためにはCOPYコマンドを使用します。構文は以下のとおりです。

copy <table_name> from 's3://<bucket_name>/<object_prefix>'
credentials 'aws_access_key_id=<my aws_access key id>;
aws_secret_access_key=<my aws secret access key>' [<options>];

注意:
これらの例は、読み易くする為に改行が含まれています。
認証情報を設定する際は、改行やスペースを含めないようにしてください。

ロードされるテーブルは、データベースに既に存在している必要があります。テーブルを作成する方法については、CREATE TABLEをご参照ください。

<my aws access key id><my aws secret access key>の値はAmazon S3のオブジェクトにアクセスするために必要なAWSの認証情報です。これらの認証情報は、IAMユーザーに対応する場合、そのIAMユーザーはロードされているAmazon S3のオブジェクトに対するGETLISTの権限を持っている必要があります。Amazon S3のIAMユーザの詳細については、Amazon S3 開発者ガイドのAccess Controlをご参照ください。

あなたは、一時的なセキュリティ証明書を使用して、ユーザーのデータへのアクセスを制限する事が出来ます。証明書の寿命は短く、期限切れの後に再利用する事が出来ないようになっているので一時的なセキュリティ証明書は強化されたセキュリティ対応方法となります。有効期限が切れるまでの間、これらの一時的なセキュリティ認証情報を持つユーザーは、リソースにアクセスする事が出来ます。詳細については、Temporary Security Credentialsをご参照ください。一時的なアクセス認証情報を使用してデータをロードするには、以下の構文を使用します。

copy <table_name> from 's3://<bucket_name>/<object_prefix>'
credentials 'aws_access_key_id=<temporary-access-key-id>;
aws_secret_access_key=<temporary-secret-access-key>;
token=<temporary-token>' 
[<options>];

重要:
一時的なセキュリティ認証情報は、COPY文実行の全期間に渡って有効である必要があります。
一時的なセキュリティ認証情報は、ロード処理中に有効期限が切れる場合、コピーは失敗し、
トランザクションはロールバックされます。
例えば、一時的なセキュリティ認証情報の有効期限が15分、COPYの処理時間が1時間掛かる場合、
COPY処理は完了する前に時間切れで失敗するでしょう。

実際にテーブルをロードせずにデータを検証したい場合は、COPYコマンドでNOLOADオプションを使用します。以下の例は、venue.txtという名前のファイルにパイプで区切られたデータの最初の数行を示しています。

1|Toyota Park|Bridgeview|IL|0
2|Columbus Crew Stadium|Columbus|OH|0
3|RFK Stadium|Washington|DC|0

ファイルをAmazon S3にアップロードする前に、COPYコマンドで並列処理を利用してファイルを読み込む事が出来るように、複数ファイルに分割をしておきましょう。詳細については、Splitting your data into multiple filesをご参照ください。

例えば、以下のようにvenue.txtファイルは4つのファイルに分割される場合があります。

venue.txt.1
venue.txt.2
venue.txt.3
venue.txt.4

以下のCOPYコマンドは、Amazon S3のバケット:mybucketに於ける接頭辞venueを持つデータファイル(パイプで区切られたデータを使用)を使い、VENUEテーブルにデータをロードしています。

注意:
以下の例ではAmazon S3バケットmybucketは存在しません。
実際のデータ、バケットを使用してCOPYを実行してみる場合は、Amazon Redshift DB開発者ガイドの
Step 4: Load sample dataをご参照ください。

キー接頭辞venueのオブジェクトが存在しない場合、ロードは失敗します。

GZIP圧縮ファイルのロード

GZIPを使用して圧縮されたデータファイルをロードするには、gzipのオプションを含めるようにします。

copy customer from 's3://mybucket/customer.gz' 
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<your-secret-access-key>' 
delimiter '|' gzip;

gzip圧縮オプションを使用する場合は、ロードされる全てのデータファイルがGZIP圧縮されている事を確認してください。

固定長データのロード

固定幅のデータファイルは、データの列毎に均一な長さを有しています。固定幅のデータファイルの各フィールドは、正確に同じ長さ・位置を持っています。文字データ(CHAR or VARCHAR)の場合、固定幅のデータファイルには、幅を均一に保つ為に、先頭又はプレースホルダとして末尾のスペースを含める必要があります。整数の場合は、プレースホルダーとして先行ゼロを使用する必要があります。固定幅のデータファイルには、列に対する区切り文字はありません。

既存のテーブルに固定幅のデータファイルをロードするには、COPYコマンドでFIXEDWIDTHパラメータを使用します。データを正常にロードさせる為には、テーブル仕様の各種値は、順番にfixedwidth_specの値と一致する必要があります。

テーブルへのファイルから固定幅データをロードするには、以下のコマンドを発行します。

copy table_name from 's3://mybucket/prefix' 
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<your-secret-access-key>' 
fixedwidth 'fixedwidth_spec';

fixedwidth_specパラメータは、各列の幅の値を定義市、列間をコロン(:)で区切った文字列です。column(列):width(列の幅)というように、列と列幅はコンマで区切られます。列は数字、文字、または2つの組み合わせ…識別子は任意に指定可能です。識別子はテーブル自体には関係がありませんので、仕様はテーブルと同じ順序で列が含まれている必要があります。

以下2つの例は、数値識別子、文字列識別子を使用して同じ仕様を示しています。

'0:3,1:25,2:12,3:2,4:6'
'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6'

以下例では上記の仕様を使ってVENUEテーブルにロードする事が出来た固定幅のサンプルデータを示しています。

1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756

以下COPYコマンドは、VENUEテーブルに設定されたデータをロードします。

copy venue
from 's3://mybucket/data/venue_fw.txt' 
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<your-secret-access-key>' 
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';

Amazon S3からのマルチバイトデータのロード

もしデータに非ASCIIのマルチバイト文字(中国語やキリル文字等)が含まれている場合は、VARCHAR型の列にデータをロードする必要があります。VARCHARデータ型は4バイトのUTF-8文字をサポートしていますが、CHARデータ型はシングルバイトのASCII文字を使用出来ます。Amazon Redshiftのテーブルに5バイト以上の文字を読み込む事は出来ません。

CHARとVARCHARの詳細については、Data typesをご参照ください。入力ファイルが使用するエンコード方式を確認するには、Linuxのfileコマンドを使用します。

$ file ordersdata.txt
ordersdata.txt: ASCII English text
$ file uni_ordersdata.dat
uni_ordersdata.dat: UTF-8 Unicode text

Amazon S3からの暗号化データのロード

クライアントの暗号化を使用して、Amazon S3にアップロードされたデータファイルをロードする為にCOPYコマンドを使う事が出来ます。

ファイルはBase64でエンコードされたAES 256ビットの鍵を用いて暗号化されます。暗号化されたファイルをロードする時に、そのキー値を提供する必要があります。詳しくはUploading encrypted data to Amazon S3をご参照ください。

暗号化されたデータファイルをロードする為に、マスターキーの値を認証文字列に追加し、ENCRYPTEDオプションを含めます。

copy customer from 's3://mybucket/encrypted/customer' 
credentials 'aws_access_key_id=<Your-Access-Key-ID>;
aws_secret_access_key=<your-secret-access-key>;
master_symmetric_key=<master_key>' delimiter '|' encrypted;

GZIP圧縮され暗号化されたデータファイルをロードするには、マスターキー値・ENCRYPTEDオプションと共にGZIPオプションを含めます。

copy customer from 's3://mybucket/encrypted/customer' 
credentials 'aws_access_key_id=<Your-Access-Key-ID>;
aws_secret_access_key=<your-secret-access-key>;
master_symmetric_key=<master_key>' delimiter '|' encrypted gzip;

 

Amazon DynamoDBからのデータのロード

単一のAmazon DynamoDBのテーブルからデータを持つテーブルをロードする為にCOPYコマンドを使用する事が出来ます。

COPYコマンドは、Amazon DynamoDBのテーブルから並列にデータを読み込んでロードする為に、Amazon Redshift超並列処理(Massively Parallel Processing:MPP)アーキテクチャを活用しています。 Amazon Redshiftのテーブルに分散キーを設定する事で、並列処理を最大限に活用する事が出来ます。詳細については、Choosing a data distribution methodをご参照ください。

重要:
COPYコマンドがAmazon DynamoDBテーブルからデータを読み込む時、
結果のデータ転送はそのテーブルのプロビジョニングされたスループットの一部です。

プロビジョニングされた読み出しのスループットの過剰消費を回避するには、本番環境にあるAmazon DynamoDBのテーブルからデータをロードしない事をお勧めします。

本番環境のテーブルからデータをロードする場合、我々は未使用のプロビジョニングスループットの平均割合よりも遥かに低いREADRATIOオプションを設定する事をお勧めします。低READRATIOはスロットルの問題を最小限に抑える事が出来ます。Amazon DynamoDBのテーブルの全体のプロビジョニングスループットを使用するには、READRATIO100を設定します。

COPYコマンドは以下のルールを使用する事により、Amazon DynamoDBのテーブルから取得したアイテムの属性名と既存のAmazon Redshiftテーブルのカラム名が一致します。

  • Amazon Redshiftの列は、大文字と小文字を区別せずにAmazon DynamoDBの項目属性にマッチしました。DynamoDBのテーブル内の項目は、"Price"と"PRICE"のように、大文字小文字の相違のみが異なる復数の属性が含まれている場合、COPYコマンドは失敗します。
  • Amazon DynamoDBのテーブル内の属性と一致しないAmazon Redshiftの列は、COPYコマンドでEMPTYASNULLオプションで指定した値に応じて、NULLまたは空のいずれかとしてロードされます。
  • Amazon Redshiftの列と一致しないAmazon DynamoDBの属性は破棄されます。属性は、それらが一致する前に読まれ、破棄された属性はそのテーブルのプロビジョニングされたスループットの一部を消費してしまいます。
  • スカラーSTRINGNUMBERデータ型はAmazon DynamoDBの属性でのみサポートされています。Amazon DynamoDB BINARYSETデータ型はサポートされていません。COPYコマンドはサポートされていないデータ型を持つ属性をロードしようとすると、コマンドは失敗します。属性は、Amazon Redshiftのテーブル列と一致しない場合、COPYコマンドではそれをロードしようとせず、エラーは発生しません。

COPYコマンドでAmazon DynamoDBのテーブルからデータをロードするには、以下の構文を使用します。

copy <redshift_tablename> from 'dynamodb://<dynamodb_table_name>'
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<your-secret-access-key>' 
readratio '<integer>' [options ];

<your-access-key-id><your-secret-access-key>の値は、Amazon DynamoDBのテーブルにアクセスする為に必要なAWSの認証情報です。これらの認証情報は、IAMユーザーに対応する場合、そのIAMユーザーはロードされているAmazon DynamoDBのテーブルをスキャンし、記述する為の権限を持っている必要があります。

あなたは、一時的なセキュリティ証明書を使用して、データへのアクセスがあるユーザーを制限する事が出来ます。(一時的なセキュリティ認証に関する説明は何度か文章で出てるので割愛)

一時的なアクセス認証情報を使用してDynamoDBからデータをロードするには以下の構文を使用します。(COPYに関する一時的なセキュリティ期限に関する説明も既出なので割愛)

copy <redshift_tablename> from 'dynamodb://<dynamodb_table_name>'
credentials 'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>' 
[<options>];

実際にロードせずにデータを検証したい場合、COPYコマンドでNOLOADオプションを使用します。以下の例は、Amazon DynamoDBのmy-favorite-movies-tableテーブルからAmazon RedshiftのFAVORITEMOVIESテーブルにデータをロードしています。読み込むアクティビティは、プロビジョニングスループットの50%まで消費する事があります。

copy favoritemovies from 'dynamodb://my-favorite-movies-table' 
credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<your-secret-access-key>' 
readratio 50;

スループットを最大化する為に、クラスタ内の計算ノード内で並列にAmazon DynamoDBのテーブルからCOPYコマンドのデータをロードします。

自動圧縮によりプロビジョニングされたスループット

デフォルトでは、無圧縮エンコーディングで空のターゲットテーブルを指定する時、COPYコマンドは自動圧縮を適用します。

自動圧縮分析は最初にAmazon DynamoDBのテーブルから多数の行をサンプリングしています。サンプリングサイズはCOMPROWSパラメータの値に基づいている。デフォルトでは、スライス毎に100,000行です。サンプリングした後、サンプル行は破壊され、表全体がロードされます。その結果、多くの行が2回読み取られます。どの様に自動圧縮の動作が行われるかの詳細については、Loading tables with automatic compressionをご参照ください。

重要:
COPYコマンドがAmazon DynamoDBテーブルからデータを読み込む時、
結果のデータ転送はそのテーブルのプロビジョニングされたスループットの一部です。

Amazon DynamoDBからのマルチバイトデータのロード

(『Amazon S3からのマルチバイトデータのロード』と同じ記述内容だったので割愛。)

 

入力データの検証

実際にデータをロードする前にAmazon S3の入力ファイルやAmazon DynamoDBのテーブルのデータを検証するには、COPYコマンドでNOLOADオプションを使用します。実際にデータをロードする為に使用するのと同じCOPYコマンド・オプションでNOLOADを使用してください。NOLOADは、データベースにロードする事無く、全てのデータの整合性をチェックします。NOLOADオプションを使用すると、データをロードしようとしていた場合に発生するすべてのエラーを表示します。

例えば、入力ファイルに誤ったAmazon S3のパスを指定した場合、以下のようなエラーが表示されます:

ERROR:  No such file or directory
DETAIL:
-----------------------------------------------
Amazon Redshift error:  The specified key does not exist
code:      2
context:   S3 key being read :
location:  step_scan.cpp:1883
process:   xenmaster [pid=22199]
-----------------------------------------------

エラーメッセージのトラブルシューティングには、Load error referenceをご参照ください。

 

自動圧縮を用いたテーブルのロード

Amazon Redshiftでは、データの独自の評価に基づいて、手動でテーブルの列に圧縮エンコーディングを適用する事が出来ます。また、分析の為にCOPYコマンドを使い、自動的に圧縮を分析する事も出来ます。自動的に圧縮を適用させる為にCOPYコマンドを使う事を、我々は強くお奨めします。

新しいテーブルを作成しロードを行う際に、自動圧縮を使用する事が出来ます。COPYコマンドは、圧縮解析を実行します。また、既にpopulatedされたテーブルに対してANALYZE COMPRESSIONコマンドを実行し、データをロードしたりテーブルの圧縮を変更する事無く、圧縮解析を行う事が出来ます。例えば、既存のDDLを維持しながら、将来の使用のためにテーブル上で圧縮について分析したい時に、ANALYZE COMPRESSIONコマンドを実行する事が出来ます。

自動圧縮の仕組み

デフォルトでは、空のターゲットテーブルとRAWエンコーディング又はエンコーディングを持っていないテーブルの全て列にCOPYコマンドを実行する度に、COPYコマンドは自動圧縮を適用します。

空のテーブルに自動圧縮を適用させる為には、現在の圧縮符号化方式の内容に関わらず、COMPUPDATEオプションをONに設定してCOPYコマンドを実行します。既にデータが含まれているテーブルに対して自動圧縮を適用する事は出来ません。

注意:
自動圧縮分析を行うには、十分なロードデータが必要となります。
(スライス辺りで少なくとも100,000行)

自動圧縮は、ロードトランザクションの一部としてバックグラウンドでこれらの操作を実行します。

  • 1.行の最初のサンプルは、入力ファイルからロードされます。サンプルサイズはCOMPROWSのパラメータの値に基づいています。デフォルトは100,000です。
  • 2.Compressionオプションは列毎に選択されています。
  • 3.サンプル行がテーブルから削除されます。
  • 4.十分なデータが意味のあるサンプルを提供する為にロードされている場合、テーブルは、選択された圧縮符号化を使用して再作成されます。
  • 5.全入力ファイルが読み込まれ、新しいエンコーディングを使用して圧縮されます。

COPYコマンドを実行した後、テーブルが完全にロード&圧縮され、使用する準備が整いました。もし後ほどもっとロードしたくなった場合、追加された行は既存のエンコーディングに従って圧縮されます。

もしあなただけが圧縮解析を行いたい場合は、フルコピーを実行するよりも効率的にである圧縮:ANALYZE COMPRESSIONを実行します。その後、自動圧縮を使用するか、テーブルを手動で再作成するかどうかを決定する為に結果を評価する事が出来ます。

自動圧縮は、COPYコマンドでサポートされています。テーブルを作成する際の別の方法としては、手動で圧縮符号化を適用する事が出来ます。手動圧縮符号化の詳細については、Choosing a column compression typeをご参照ください。

自動圧縮サンプル

この例では、TICKITデータベースにはBIGLISTと呼ばれているLISTINGテーブルのコピーが含まれていると仮定し、あなたは約3万行がロードされた時に自動圧縮をこのテーブルに適用させたい、という状況だったとします。

ロードして自動的にテーブル圧縮を行うには、以下の手順をご参考ください。

  • 1.テーブルが空である事を確認します。空のテーブルにのみ、自動圧縮を適用させる事が出来ます。
  • truncate biglist;
    
  • 2.単一のCOPYコマンドでデータをロードします。テーブルが空であるものの、以前に幾つかのエンコーディングが指定されている可能性があります。Amazon Redshiftで圧縮解析を行えるように、COMPUPDATEパラメータはONに設定してください。COMPROWSオプションが指定されていないので、スライス当たり10万行の推奨サンプルサイズが適用されます。
  • copy biglist from 's3://mybucket/biglist.txt' 
    credentials 'aws_access_key_id=<your-access-key-id>;aws_secret_access_key=<your-secret-access-key>'
    delimiter '|' COMPUPDATE ON;
    
  • 3.自動的に選択された符号化方式を検討する為に、BIGLISTテーブルの新しいスキーマを確認して下さい。
  • select "column", type, encoding 
    from pg_table_def where tablename = 'biglist';
    
       Column      |            Type               | Encoding 
    ---------------+-----------------------------+----------
    listid         | integer                     | delta    
    sellerid       | integer                     | delta32k 
    eventid        | integer                     | delta32k 
    dateid         | smallint                    | delta    
    +numtickets    | smallint                    | delta    
    priceperticket | numeric(8,2)                | delta32k 
    totalprice     | numeric(8,2)                | mostly32 
    listtime       | timestamp without time zone | none     
    
  • 4.想定した行数がロードされている事を確認します。
  • select count(*) from biglist;
    
    count
    ---------
    3079952
    (1 row)
    

後ほど、COPYやINSERTを用いてこのテーブル行が追加された際に、同じ圧縮エンコーディングが適用されます。

 

狭いテーブルのストレージを最適化

(narrow table=狭いテーブル、と直訳したけど良いのかなぁ...)

もし、テーブルにとても少ない列しか無い、けどとても多くの行を抱えているような場合、3つの隠されたメタデータのID列(INSERT_XID, DELETE_XID, ROW_ID)は、テーブルのディスク領域を不均衡な形で消費してしまいます。

非表示列の圧縮を最適化する為に、可能であれば単一のCOPYトランザクションでテーブルを読み込みましょう。複数の独立したCOPYコマンドでテーブルをロードする場合、INSERT_XID列は上手く圧縮されません。複数のCOPYコマンドを使用する場合は、VACUUM操作を実行する必要がありますが、それを行ってもINSERT_XIDの圧縮は改善されません。

 

デフォルト列の値のロード

必要に応じてCOPYコマンドで列リストを定義する事が出来ます。テーブル内の列が列リストから省略されている場合、COPYはCREATE TABLEコマンドで指定されたデフォルトのオプションによって、またNULLによって(DEFAULTオプションが指定されていない場合)提供されるいずれかの値を持つ列をロードします。

COPYがNULLをNOT NULLが定義されている列に割り当てようとしている場合、COPYコマンドは失敗します。DEFAULTオプションを割り当てる方法については、CREATE TABLEをご参照ください。

Amazon S3上のデータファイルからロードする場合、列リスト内の列は、データファイル内のフィールドと同じ順序でなければなりません。データファイル内のフィールドが列リストに対応する列を持たない場合、COPYコマンドは失敗します。Amazon DynamoDBのテーブルからロードする場合、順序は重要ではありません。Amazon Redshiftのテーブル列と一致しないAmazon DynamoDBの属性内の任意のフィールドは破棄されます。

テーブルにデフォルト値をロードする為にCOPYコマンドを使用する時は、以下の制限が適用されます。

  • IDENTIFY列が列リストに含まれている場合、EXPLICIT_IDSオプションもCOPYコマンドで指定する必要があります。でないとCOPYコマンドは失敗します。同様に、IDENTIFY列が列リストから省略され、EXPLICIT_IDSオプションが指定された場合も、コピー操作は失敗します。
  • 特定の列を与えられた評価DEFAULT式がロードされた全ての行で同じならば、RANDOM()関数を使うDEFAULT式は全ての行に同じ値を割り当てます。
  • CURRENT_DATEまたはSYSDATEが含まれているDEFAULT式は、現在のトランザクションのタイムスタンプに設定されています。

詳細については、 COPY examples内の"デフォルト値を持つファイルからのデータのロード"をご参照ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.