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

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

COPY コマンドを実行して、SSB のスキーマの各テーブルをロードします。この 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 ロール の Amazon リソースネーム (ARN) が含まれます。Amazon S3 からデータをロードするには、認証情報に ListBucket と GetObject のアクセス許可が含まれている必要があります。データが暗号化されている場合は、追加の認証情報が必要です。詳細については、COPY コマンドのリファレンスの「認証パラメータ」を参照してください。アクセスの管理の詳細については、Amazon S3 リソースへの許可の管理を参照してください。

オプション

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

SSB テーブルのロード

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

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

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

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

copy table from 's3://<your-bucket-name>/load/key_prefix' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' options;

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

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

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

  2. <aws-account-id> および <role-name> は、使用している AWS アカウント ならびに IAM ロールに置き換えます。一重引用符で囲まれた認証情報文字列に、スペースまたは改行を含めることはできません。ARN の形式はサンプルとは多少異なる場合があることに注意してください。COPY コマンドを実行するときは、正しい ARN を使用するために、IAM コンソールからロールの ARN をコピーすることをお勧めします。

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

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

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

キープレフィックス

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

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") が表示されます。

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 part from 's3://<your-bucket-name>/load/part-csv.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' csv;

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

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) の値を調整できます。

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;
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 ターミネータ文字 (\x000 または \x0) を使用して NULL 値を表します。

注記

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

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

注記

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

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

copy part from 's3://<your-bucket-name>/load/part-csv.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' csv null as '\000';

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

select p_partkey, p_name, p_mfgr, p_category from part where p_mfgr is null;
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 テーブルから抜粋した次のデータでは、パイプ区切り形式を使用しています。

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 リージョンに配置してください。データとクラスターが同じリージョンにある場合、レイテンシーが短縮され、リージョン間のデータ転送のコストを回避できます。詳細については、「データをロードするための Amazon Redshift のベストプラクティス」を参照してください。

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

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

copy supplier from 's3://awssampledbuswest2/ssbgz/supplier.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' delimiter '|' gzip region 'us-west-2';

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

copy supplier from 's3://awssampledb/ssbgz/supplier.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' delimiter '|' gzip region 'us-east-1';

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

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

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

固定幅形式

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

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 テーブルのデータの固定幅指定文字列は、次のとおりです。

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 customer from 's3://<your-bucket-name>/load/customer-fw.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 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';

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

An error occurred when executing the SQL command: copy customer from 's3://mybucket/load/customer-fw.tbl' credentials'... 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 customer from 's3://<your-bucket-name>/load/customer-fw.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 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;

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

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 テーブルに対してクエリを実行します。

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 のクエリの結果は次のようになるはずです。

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 件のメッセージがあることがわかります。

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

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

  • String contains invalid or unsupported UTF8

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

負荷に関するもう一つの問題は、検出がより難しく、負荷が予期せぬ結果を生み出しました。この問題を調査するには、以下のコマンドを実行して、CUSTOMER テーブルをクエリします。

select c_custkey, c_name, c_address from customer order by c_custkey limit 10;
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 のテキストを示します。

{ "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 customer from 's3://<your-bucket-name>/load/customer-fw-manifest' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 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 の日付形式が一貫していないことに注意してください。

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 dwdate from 's3://<your-bucket-name>/load/dwdate-tab.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' 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 管理ガイド」の「クラスターおよびノードについて」を参照してください。

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

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

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

複数のファイルを使用して COPY のパフォーマンスを評価するには
  1. 単一のファイルから COPY を実行するには、以下のコマンドを実行します。バケット名を変更しないでください。

    copy lineorder from 's3://awssampledb/load/lo/lineorder-single.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' gzip compupdate off region 'us-east-1';
  2. 結果は次のようになります。実行時間を書き留めてください。

    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 lineorder from 's3://awssampledb/load/lo/lineorder-multi.tbl' credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>' gzip compupdate off region 'us-east-1';
  4. 結果は次のようになります。実行時間を書き留めてください。

    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: データベースにバキューム操作を実行し、分析する