メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

ステップ 5: COPY コマンドを実行する

COPY コマンドを実行して、SSB のスキーマの各テーブルをロードします。この COPY コマンドの例は、さまざまなファイル形式からのロード、COPY コマンドのオプションの使用、およびロードエラーのトラブルシューティングの方法を示しています。

COPY コマンドの構文

基本的な COPY コマンドの構文は次のとおりです。

Copy
COPY table_name [ column_list ] FROM data_source CREDENTIALS access_credentials [options]

COPY コマンドを実行するには、以下の値を指定します。

テーブル名

COPY コマンドのターゲットテーブル。テーブルはすでにデータベースに存在する必要があります。テーブルは一時テーブルまたは永続的テーブルです。COPY コマンドは、新しい入力データをテーブルの既存の行に追加します。

列リスト

デフォルトでは、COPY はソースデータのフィールドを順番にテーブルの列にロードします。オプションで、列名のカンマ区切りリストである列リストを指定して、データフィールドを特定の列にマッピングすることができます。このチュートリアルでは列リストを使用しません。詳細については、COPY コマンドのリファレンスの「Column List」を参照してください。

データソース

COPY コマンドを使用して、Amazon S3 バケット、Amazon EMR クラスター、リモート ホスト (SSH 接続を使用)、または Amazon DynamoDB テーブルからデータをロードできます。このチュートリアルでは、Amazon S3 バケットのデータファイルからロードします。Amazon S3 からロードするときには、バケットの名前とデータファイルの場所を指定する必要があります。そのためには、データファイルのオブジェクトパスを指定するか、または各データファイルとその場所を明示的にリストするマニフェストファイルの場所を指定する必要があります。

  • キープレフィックス

    Amazon S3 に格納されたオブジェクトはオブジェクトキーによって一意に識別されます。オブジェクトキーには、バケット名、フォルダ名 (存在する場合)、およびオブジェクト名が含まれます。キープレフィックスは、同じプレフィックスを持つ一連のオブジェクトを指します。オブジェクトパスは、キープレフィックスを共有するすべてのオブジェクトをロードするために、COPY コマンドで使用するキープレフィックスです。たとえば、キープレフィックス custdata.txt は、単一のファイルを指す場合も、custdata.txt.001custdata.txt.002 など、一連のファイルを指す場合もあります。

  • マニフェストファイル

    プレフィックスの異なるファイルをロードする必要がある場合、たとえば、複数のバケットまたはフォルダからファイルをロードする場合や、プレフィックスを共有するファイルを除外する必要がある場合は、マニフェストファイルを使用できます。マニフェストファイルは、ロードする各ファイルとその一意のオブジェクトキーを明示的にリストします。このチュートリアルでは、マニフェストファイルを使用して PART テーブルをロードします。

認証情報

ロードするデータが格納されている AWS リソースにアクセスするには、十分な特権を持つ AWS ユーザーまたは IAM ユーザーの AWS アクセス認証情報 (アクセスキー ID とシークレットアクセスキー) を指定する必要があります。Amazon S3 からデータをロードするには、認証情報に ListBucket と GetObject のアクセス許可が含まれている必要があります。データが暗号化されている場合や、一時的なアクセス認証情報を使用している場合は、追加の認証情報が必要です。詳細については、COPY コマンドのリファレンスの「認証パラメータ」を参照してください。アクセスの管理の詳細については、「Amazon S3 リソースへのアクセス許可の管理」を参照してください。アクセスキー ID とシークレットアクセスキーがない場合は、これらを取得する必要があります。詳細については、「IAM ユーザーのアクセスキーの管理」を参照してください。

オプション

COPY コマンドで多くのパラメータを指定することによって、ファイル形式の指定、データ形式の管理、エラーの管理、およびその他の機能の制御を行うことができます。 このチュートリアルでは、次のような COPY コマンドのオプションおよび機能を使用します。

SSB テーブルのロード

SSB スキーマの各テーブルをロードするには、次の COPY コマンドを使用します。各テーブルに対するコマンドは、COPY のさまざまなオプションとトラブルシューティングの手法を示しています。

SSB テーブルをロードするには、以下の手順に従います。

バケット名と AWS 認証情報の置き換え

このチュートリアルの COPY コマンドは次の形式で表示されます。

Copy
copy table from 's3://<your-bucket-name>/load/key_prefix' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' options;

各 COPY コマンドで、以下の作業を行います。

  1. <your-bucket-name> を、お使いのクラスターと同じリージョンにあるバケットの名前に置き換えます。

    このステップでは、バケットとクラスターが同じリージョンにあることを前提としています。代わりに、COPY コマンドで REGION オプションを使用してリージョンを指定できます。

  2. <Your-Access-Key-ID><Your-Secret-Access-Key> を、独自の AWS IAM アカウントの認証情報に置き換えます。一重引用符で囲まれた認証情報文字列に、スペースまたは改行を含めることはできません。

NULL AS を使用した PART テーブルのロード

このステップでは、CSV オプションと NULL AS オプションを使用して、PART テーブルをロードします。

COPY コマンドでは、複数のファイルから並列してデータをロードでき、1 つのファイルからロードする場合よりも高速です。この原理を示すために、このチュートリアルでは、ファイルは非常に小さくなりますが、各テーブルのデータを 8 個のファイルに分割しています。後のステップで、1 つのファイルからのロードと複数のファイルからのロードとの時間の差を比較します。詳細については、「ロードデータの複数のファイルへの分割」を参照してください。

キープレフィックス

ファイルセットのキープレフィックスを指定するか、マニフェストファイルにファイルのリストを明示的に指定することで、複数のファイルからロードできます。このステップでは、キープレフィックスを使用します。後のステップでは、マニフェストファイルを使用します。キープレフィックス 's3://mybucket/load/part-csv.tbl' によって、load フォルダ内の以下のファイルのセットがロードされます。

Copy
part-csv.tbl-000 part-csv.tbl-001 part-csv.tbl-002 part-csv.tbl-003 part-csv.tbl-004 part-csv.tbl-005 part-csv.tbl-006 part-csv.tbl-007

CSV 形式

CSV は、カンマ区切り値を意味し、スプレッドシートのデータをインポートおよびエクスポートする際に使用される一般的な形式です。CSV では、フィールド内に引用符で囲まれた文字列を含めることができるため、カンマ区切り形式よりも柔軟です。CSV 形式から COPY を実行する場合、デフォルトの引用文字は二重引用符 ( " ) ですが、QUOTE AS オプションを使用して別の引用文字を指定できます。フィールド内で引用文字を使用する場合、引用文字を追加してその文字をエスケープします。

PART テーブルの CSV 形式のデータファイルから抜粋した次のデータは、二重引用符で囲まれた文字列 ("LARGE ANODIZED BRASS") と、引用符で囲まれた文字列内の 2 個の二重引用符で囲まれた文字列を示しています。"MEDIUM ""BURNISHED"" TIN"

Copy
15,dark sky,MFGR#3,MFGR#47,MFGR#3438,indigo,"LARGE ANODIZED BRASS",45,LG CASE 22,floral beige,MFGR#4,MFGR#44,MFGR#4421,medium,"PROMO, POLISHED BRASS",19,LG DRUM 23,bisque slate,MFGR#4,MFGR#41,MFGR#4137,firebrick,"MEDIUM ""BURNISHED"" TIN",42,JUMBO JAR

PART テーブルのデータには、COPY が失敗する原因となる文字が含まれています。この演習では、エラーをトラブルシューティングし、修正します。

形式のデータをロードするには、COPY コマンド に csvcsv を追加 します。次のコマンドを実行して PART テーブルをロードします。

Copy
copy part from 's3://<your-bucket-name>/load/part-csv.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' csv;

次のようなエラーメッセージが表示されます。

Copy
An error occurred when executing the SQL command: copy part from 's3://mybucket/load/part-csv.tbl' credentials' ... ERROR: Load into table 'part' failed. Check 'stl_load_errors' system table for details. [SQL State=XX000] Execution time: 1.46s 1 statement(s) failed. 1 statement(s) failed.

エラーに関する詳細情報を取得するには、STL_LOAD_ERRORS テーブルに対してクエリを実行します。次のクエリでは、列を短縮して読みやすくするために SUBSTRING 関数を使用し、返される行数を減らすために LIMIT 10 を使用しています。バケット名の長さに合わせて、substring(filename,22,25) の値を調整できます。

Copy
select query, substring(filename,22,25) as filename,line_number as line, substring(colname,0,12) as column, type, position as pos, substring(raw_line,0,30) as line_text, substring(raw_field_value,0,15) as field_text, substring(err_reason,0,45) as reason from stl_load_errors order by query desc limit 10;
Copy
query | filename | line | column | type | pos | --------+-------------------------+-----------+------------+------------+-----+---- 333765 | part-csv.tbl-000 | 1 | | | 0 | line_text | field_text | reason ------------------+------------+---------------------------------------------- 15,NUL next, | | Missing newline: Unexpected character 0x2c f

NULL AS

part-csv.tbl データファイルでは、NUL ターミネータ文字 (\x0 または \x000) を使用して NULL 値を表します。

注記

スペルやよく似ていますが、NUL と NULL は同じではありません。NUL は、コードポイントが x000 である UTF-8 文字で、通常、レコードの終わり (EOR) を示すために使用されます。NULL はデータがないことを表す SQL 値です。

デフォルトでは、COPY は NUL ターミネータ文字を EOR 文字として処理し、レコードを終了します。これは通常、予期しない結果やエラーが発生する原因となります。テキストデータで NULL を示す標準的な方法がないため、COPY コマンドの NULL AS オプションによって、テーブルをロードするときに NULL に置き換える文字を指定できます。この例では、COPY で、NUL ターミネータ文字を NULL 値として処理する必要があります。

注記

NULL 値を受け取るテーブルの列は、NULL が許容されるように設定されている必要があります。つまり、CREATE TABLE の指定に NOT NULL 制約を含めないでください。

NULL AS オプションを使って PART をロードするには、次の COPY コマンドを実行します。

Copy
copy part from 's3://<your-bucket-name>/load/part-csv.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' csv null as '\000';

COPY によって NULL 値がロードされたことを確認するには、次のコマンドを実行して NULL を含む行のみを選択します。

Copy
select p_partkey, p_name, p_mfgr, p_category from part where p_mfgr is null;
Copy
p_partkey | p_name | p_mfgr | p_category -----------+----------+--------+------------ 15 | NUL next | | MFGR#47 81 | NUL next | | MFGR#23 133 | NUL next | | MFGR#44 (2 rows)

REGION を使用した SUPPLIER テーブルのロード

このステップでは、DELIMITER オプションと REGION オプションを使用して、SUPPLIER テーブルをロードします。

注記

SUPPLIER テーブルを読み込むためのファイルは、AWS サンプルバケットに用意されています。このステップでファイルをアップロードする必要はありません。

文字区切り形式

文字区切りファイルのフィールドは、パイプ文字 ( | )、カンマ ( , )、タブ ( \t ) など、特定の文字で区切られます。文字区切りファイルでは、区切り記号として、非表示の ASCII 文字を含め、任意の ASCII 文字 1 文字を使用できます。DELIMITER オプションを使用して区切り文字を指定できます。デフォルトの区切り文字はパイプ文字です。

SUPPLIER テーブルから抜粋した次のデータでは、パイプ区切り形式を使用しています。

Copy
1|1|257368|465569|41365|19950218|2-HIGH|0|17|2608718|9783671|4|2504369|92072|2|19950331|TRUCK 1|2|257368|201928|8146|19950218|2-HIGH|0|36|6587676|9783671|9|5994785|109794|6|19950416|MAIL

REGION

可能な限り、ロードデータは Amazon Redshift クラスターと同じ AWS リージョンに配置してください。データとクラスターが同じリージョンにある場合、レイテンシーが短縮され、結果として整合性の問題を最小化し、リージョン間のデータ転送のコストを回避できます。詳細については、「データロードのベストプラクティス」を参照してください。

別の AWS リージョンからデータをロードする必要がある場合は、REGION オプションを使用して、ロードデータが配置されている AWS リージョンを指定します。リージョンを指定する場合は、マニフェストファイルを含むすべてのロードデータが、指定されたリージョンに存在している必要があります。詳細については、「REGION」を参照してください。

クラスターが米国東部 (バージニア北部) リージョンにある場合、米国西部 (オレゴン) リージョンにある Amazon S3 バケット内のパイプ区切りデータから SUPPLIER テーブルをロードするには、次のコマンドを実行します。この例では、バケット名を変更しないでください。

Copy
copy supplier from 's3://awssampledbuswest2/ssbgz/supplier.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' delimiter '|' gzip region 'us-west-2';

クラスターが米国東部 (バージニア北部) リージョンにない場合、米国東部 (バージニア北部) リージョンにある Amazon S3 バケット内のパイプ区切りデータから SUPPLIER テーブルをロードするには、次のコマンドを実行します。この例では、バケット名を変更しないでください。

Copy
copy supplier from 's3://awssampledb/ssbgz/supplier.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' delimiter '|' gzip region 'us-east-1';

MANIFEST を使用した CUSTOMER テーブルのロード

このステップでは、FIXEDWIDTH、MAXERROR、ACCEPTINVCHARS、および MANIFEST オプションを使用して、CUSTOMER テーブルをロードします。

この演習のサンプルデータには、COPY でロードしようとしたときにエラーの原因となる文字が含まれています。MAXERRORS オプションと STL_LOAD_ERRORS システムテーブルを使用してロードエラーのトラブルシューティングを行い、次に ACCEPTINVCHARS オプションと MANIFEST オプションを使用してエラーを排除します。

固定幅形式

固定幅形式は、区切り記号でフィールドを分離するのではなく、各フィールドを固定文字数で定義します。CUSTOMER テーブルから抜粋した次のデータでは、固定幅形式を使用しています。

Copy
1 Customer#000000001 IVhzIApeRb MOROCCO 0MOROCCO AFRICA 25-705 2 Customer#000000002 XSTf4,NCwDVaWNe6tE JORDAN 6JORDAN MIDDLE EAST 23-453 3 Customer#000000003 MG9kdTD ARGENTINA5ARGENTINAAMERICA 11-783

ラベル/幅のペアの順序はテーブルの列の順序に正確に一致する必要があります。詳細については、「FIXEDWIDTH」を参照してください。

CUSTOMER テーブルのデータの固定幅指定文字列は、次のとおりです。

Copy
fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10'

固定幅データから CUSTOMER テーブルをロードするには、次のコマンドを実行します。

Copy
copy customer from 's3://<your-bucket-name>/load/customer-fw.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10';

次のようなエラーメッセージが表示されます。

Copy
An error occurred when executing the SQL command: copy customer from 's3://mybucket/load/customer-fw.tbl' credentials'aws_access_key_id=... ERROR: Load into table 'customer' failed. Check 'stl_load_errors' system table for details. [SQL State=XX000] Execution time: 2.95s 1 statement(s) failed.

MAXERROR

デフォルトでは、COPY で最初にエラーが発生したときに、コマンドは失敗し、エラーメッセージを返します。テスト中は時間を節約するために、MAXERROR オプションを使用して、失敗する前に指定した数のエラーをスキップするように COPY に指示できます。CUSTOMER テーブルのデータのロードを最初にテストするときにはエラーが予想されるため、COPY コマンドに maxerror 10 を追加します。

FIXEDWIDTH オプションと MAXERROR オプションを使用してテストするには、次のコマンドを実行します。

Copy
copy customer from 's3://<your-bucket-name>/load/customer-fw.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10' maxerror 10;

今回は、エラーメッセージの代わりに、次のような警告メッセージが表示されます。

Copy
Warnings: Load into table 'customer' completed, 112497 record(s) loaded successfully. Load into table 'customer' completed, 7 record(s) could not be loaded. Check 'stl_load_errors' system table for details.

この警告は、COPY で 7 個のエラーが発生したことを示します。エラーを確認するには、次の例のように、STL_LOAD_ERRORS テーブルに対してクエリを実行します。

Copy
select query, substring(filename,22,25) as filename,line_number as line, substring(colname,0,12) as column, type, position as pos, substring(raw_line,0,30) as line_text, substring(raw_field_value,0,15) as field_text, substring(err_reason,0,45) as error_reason from stl_load_errors order by query desc, filename limit 7;

STL_LOAD_ERRORS のクエリの結果は次のようになるはずです。

Copy
query | filename | line | column | type | pos | line_text | field_text | error_reason --------+---------------------------+------+-----------+------------+-----+-------------------------------+------------+---------------------------------------------- 334489 | customer-fw.tbl.log | 2 | c_custkey | int4 | -1 | customer-fw.tbl | customer-f | Invalid digit, Value 'c', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 6 | c_custkey | int4 | -1 | Complete | Complete | Invalid digit, Value 'C', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 3 | c_custkey | int4 | -1 | #Total rows | #Total row | Invalid digit, Value '#', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 5 | c_custkey | int4 | -1 | #Status | #Status | Invalid digit, Value '#', Pos 0, Type: Integ 334489 | customer-fw.tbl.log | 1 | c_custkey | int4 | -1 | #Load file | #Load file | Invalid digit, Value '#', Pos 0, Type: Integ 334489 | customer-fw.tbl000 | 1 | c_address | varchar | 34 | 1 Customer#000000001 | .Mayag.ezR | String contains invalid or unsupported UTF8 334489 | customer-fw.tbl000 | 1 | c_address | varchar | 34 | 1 Customer#000000001 | .Mayag.ezR | String contains invalid or unsupported UTF8 (7 rows)

この結果を調べると、error_reasons 列に 2 件のメッセージがあることがわかります。

  • Copy
    Invalid digit, Value '#', Pos 0, Type: Integ

    これらのエラーは、customer-fw.tbl.log ファイルによって発生しています。問題は、このファイルがデータファイルではなくログファイルであることです。このファイルがロードされないようにする必要があります。マニフェストファイルを使用して、誤ったファイルがロードされることを回避できます。

  • Copy
    String contains invalid or unsupported UTF8

    VARCHAR データ型は、最大 3 バイトのマルチバイト UTF-8 文字をサポートします。ロードデータにサポートされていない文字や無効な文字が含まれている場合、ACCEPTINVCHARS オプションを使用して、すべての無効な文字を指定した代替文字に置き換えることができます。

ロードのもう 1 つの問題はさらに検出が難しくなります。ロードによって、予期しない結果が発生する場合です。この問題を調査するには、次のコマンドを実行して、CUSTOMER テーブルにクエリを実行します。

Copy
select c_custkey, c_name, c_address from customer order by c_custkey limit 10;
Copy
c_custkey | c_name | c_address -----------+---------------------------+--------------------------- 2 | Customer#000000002 | XSTf4,NCwDVaWNe6tE 2 | Customer#000000002 | XSTf4,NCwDVaWNe6tE 3 | Customer#000000003 | MG9kdTD 3 | Customer#000000003 | MG9kdTD 4 | Customer#000000004 | XxVSJsL 4 | Customer#000000004 | XxVSJsL 5 | Customer#000000005 | KvpyuHCplrB84WgAi 5 | Customer#000000005 | KvpyuHCplrB84WgAi 6 | Customer#000000006 | sKZz0CsnMD7mp4Xd0YrBvx 6 | Customer#000000006 | sKZz0CsnMD7mp4Xd0YrBvx (10 rows)

行は一意である必要がありますが、重複があります。

予期しない結果を確認するもう 1 つの方法は、ロードされた行数を確認することです。今回のケースでは、100000 行がロードされているはずですが、ロードのメッセージには 112497 件のレコードがロードされたと示されています。ロードされた行が多いのは、COPY で余分なファイル customer-fw.tbl0000.bak がロードされたためです。

この演習では、マニフェストファイルを使用して、誤ったファイルがロードされることを回避します。

ACCEPTINVCHARS

デフォルトでは、COPY は列のデータ型でサポートされていない文字を検出した場合、その行をスキップし、エラーを返します。無効な UTF-8 文字の詳細については、「マルチバイト文字のロードエラー」を参照してください。

MAXERRORS オプションによってエラーを無視してロードを続行し、STL_LOAD_ERRORS にクエリを実行して無効な文字を特定した後、データファイルを修正できます。ただし、MAXERRORS はロードの問題のトラブルシューティングには最適ですが、一般的に、本番環境では使用しないでください。

ACCEPTINVCHARS オプションは、通常、無効な文字の管理するのに適しています。ACCEPTINVCHARS によって、無効な文字を指定した有効な文字で置き換え、ロード操作を続行することを COPY コマンドに指示します。置換文字として、NULL 以外の有効な ASCII 文字を指定できます。デフォルトの置換文字は疑問符 ( ? ) です。COPY は、マルチバイト文字を同じ長さの置換文字列に置き換えます。たとえば、4 バイト文字は '????' に置き換えられます。

COPY は無効な UTF-8 文字を含んでいる行の数を返し、対象行ごとに STL_REPLACEMENTS システムテーブルにエントリを追加します (各ノードスライスで最大 100 行まで)。さらに多くの無効な UTF-8 文字も置き換えられますが、それらの置換イベントは記録されません。

ACCEPTINVCHARS は VARCHAR 列に対してのみ有効です。

このステップでは、ACCEPTINVCHARS と置換文字 '^' を追加します。

MANIFEST

キープレフィックスを使用して Amazon S3 からの COPY を実行すると、不要なテーブルをロードするリスクがあります。たとえば、's3://mybucket/load/ フォルダには、キープレフィックス customer-fw.tbl を共有する 8 個のデータファイルが含まれます (customer-fw.tbl0000customer-fw.tbl0001 など)。ただし、同じフォルダには、余分なファイルである customer-fw.tbl.logcustomer-fw.tbl-0001.bak も含まれています。

必要なすべてのファイル、および正しいファイルのみをロードするには、マニフェストファイルを使用します。マニフェストは JSON 形式のテキストファイルで、ロードされる各ソースファイルについて一意のオブジェクトキーを明示的にリストします。ファイルオブジェクトは、異なるフォルダや異なるバケットにあってもかまいませんが、同じリージョンに存在している必要があります。詳細については、「MANIFEST」を参照してください。

以下に customer-fw-manifest のテキストを示します。

Copy
{ "entries": [ {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-000"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-001"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-002"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-003"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-004"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-005"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-006"}, {"url":"s3://<your-bucket-name>/load/customer-fw.tbl-007"} ] }

マニフェストファイルを使用して CUSTOMER テーブルのデータをロードするには

  1. テキストエディターで customer-fw-manifest ファイルを開きます。

  2. <your-bucket-name> を、お使いのバケットの名前に置き換えます。

  3. ファイルを保存します。

  4. バケットのロードフォルダにファイルをアップロードします。

  5. 次の COPY コマンドを実行します。

    Copy
    copy customer from 's3://<your-bucket-name>/load/customer-fw-manifest' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' fixedwidth 'c_custkey:10, c_name:25, c_address:25, c_city:10, c_nation:15, c_region :12, c_phone:15,c_mktsegment:10' maxerror 10 acceptinvchars as '^' manifest;

DATEFORMAT を使用した DWDATE テーブルのロード

このステップでは、DELIMITER オプションと DATEFORMAT オプションを使用して、DWDATE テーブルをロードします。

DATE 列と TIMESTAMP 列をロードする場合、COPY ではデフォルトの形式を想定しています。日付の場合は YYYY-MM-DD で、タイムスタンプの場合は YYYY-MM-DD HH:MI:SS です。ロードデータでデフォルトの形式が使用されていない場合、DATEFORMAT と TIMEFORMAT を使用して形式を指定できます。

次の例は、DWDATE テーブルの日付形式を示しています。列 2 の日付形式が一貫していないことに注意してください。

Copy
19920104 1992-01-04 Sunday January 1992 199201 Jan1992 1 4 4 1... 19920112 January 12, 1992 Monday January 1992 199201 Jan1992 2 12 12 1... 19920120 January 20, 1992 Tuesday January 1992 199201 Jan1992 3 20 20 1...

DATEFORMAT

日付形式は 1 つだけ指定できます。ロードデータに一貫性のない形式が含まれている場合やその形式が異なる列に含まれている場合、または形式がロード時にわからない場合は、DATEFORMAT を 'auto' 引数と共に使用します。'auto' を指定すると、COPY は有効な日付または時間形式を認識してデフォルト形式に変換します。'auto' オプションは、DATEFORMAT および TIMEFORMAT 文字列を使用する場合にサポートされない形式を認識します。詳細については、「DATEFORMAT と TIMEFORMAT で自動認識を使用する」を参照してください。

DWDATE テーブルをロードするには、次の COPY コマンドを実行します。

Copy
copy dwdate from 's3://<your-bucket-name>/load/dwdate-tab.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' delimiter '\t' dateformat 'auto';

複数ファイルを使用した LINEORDER テーブルのロード

このステップでは、GZIP オプションと COMPUPDATE オプションを使用して、LINEORDER テーブルをロードします。

この演習では、単一のデータファイルから LINEORDER テーブルをロードし、次に、複数のファイルからロードして、2 通りの方法のロード時間を比較します。

注記

LINEORDER テーブルを読み込むためのファイルは、AWS サンプルバケットに用意されています。このステップでファイルをアップロードする必要はありません。

GZIP、LZOP および BZIP2

ファイルは gzip、lzop、または bzip2 圧縮形式を使って圧縮できます。 圧縮ファイルからロードする場合、COPY はロードの過程でファイルを解凍します。ファイルを圧縮すると、ストレージ領域を節約し、アップロード時間を短縮できます。

COMPUPDATE

COPY は、圧縮エンコードなしで空のテーブルをロードする場合、ロードデータを分析し、最適なエンコードを決定します。次に、ロードを開始する前にそのエンコードを使用するようにテーブルを変更します。この分析プロセスは時間がかかりますが、分析が行われるのはテーブルごとに多くて 1 回です。時間を節約するには、COMPUPDATE をオフにすることにより、このステップを省略できます。COPY の実行時間を正確に評価するために、このステップでは COMPUPDATE をオフにします。

複数のファイル

COPY コマンドでは、1 つのファイルからロードする代わりに、複数のファイルから並列でロードすると、データを非常に効率的にロードできます。ファイルの数がクラスターのスライスの数の倍数になるようにデータをファイルに分割すると、Amazon Redshift はワークロードを分割し、データをスライス間で均等に分散させます。ノードあたりのスライスの数は、クラスターのノードサイズによって決まります。それぞれのノードサイズにあるスライスの数については、Amazon Redshift Cluster Management Guide の「クラスターおよびノードについて」を参照してください。

たとえば、このチュートリアルで使用される dc1.large コンピューティングノードにはそれぞれ 2 個のスライスがあるため、4 ノードのクラスターに 8 個のスライスがあります。前の手順では、ロードデータが非常に小さい 8 つのファイルに格納されていました。このステップでは、1 つの大きいファイルからのロードと複数のファイルからのロードとの時間の差を比較します。

このチュートリアルで使用するファイルには、約 1,500 万件のレコードが含まれ、約 1.2 GB の領域を占有しています。これらのファイルは Amazon Redshift のスケールでは非常に小さいファイルですが、複数のファイルからロードする際のパフォーマンス上の利点を示すには十分です。これらのファイルは十分に大きいため、このチュートリアルで、ファイルをダウンロードして、Amazon S3 にアップロードするには時間がかかりすぎます。したがって、AWS サンプルバケットからファイルを直接ロードします。

次のスクリーンショットは LINEORDER のデータ ファイルを示しています。

複数のファイルを使用して COPY のパフォーマンスを評価するには

  1. 1 つのファイルから COPY を実行するには、次のコマンドを実行します。バケット名を変更しないでください。

    Copy
    copy lineorder from 's3://awssampledb/load/lo/lineorder-single.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' gzip compupdate off region 'us-east-1';
  2. 結果は次のようになります。実行時間を書き留めてください。

    Copy
    Warnings: Load into table 'lineorder' completed, 14996734 record(s) loaded successfully. 0 row(s) affected. copy executed successfully Execution time: 51.56s
  3. 複数のファイルから COPY を実行するには、次のコマンドを実行します。バケット名を変更しないでください。

    Copy
    copy lineorder from 's3://awssampledb/load/lo/lineorder-multi.tbl' credentials 'aws_access_key_id=<Your-Access-Key-ID>;aws_secret_access_key=<Your-Secret-Access-Key>' gzip compupdate off region 'us-east-1';
  4. 結果は次のようになります。実行時間を書き留めてください。

    Copy
    Warnings: Load into table 'lineorder' completed, 14996734 record(s) loaded successfully. 0 row(s) affected. copy executed successfully Execution time: 17.7s
  5. 実行時間を比較します。

    この例では、1,500 万件のレコードをロードする時間が、51.56 秒から 17.7 秒へと短縮され、65.7% の削減を達成しました。

    これらの結果は 4 ノードクラスターの使用に基づいています。クラスターにさらにノードがある場合は、時間の節約は増加します。数十個から数百個のノードがある、一般的な Amazon Redshift クラスターの場合、違いはさらに明確になります。単一ノードクラスターの場合、実行時間の差はほとんどありません。

次のステップ

ステップ 6: データベースにバキューム操作を実行し、分析する