COPY例子 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

COPY例子

注意

這些範例包含換行以方便閱讀。請勿在 credentials-args 字串中包含換行或空格。

FAVORITEMOVIES從 DynamoDB 資料表載入

AWS SDKs包括建立稱為影片的 DynamoDB 資料表的簡單範例。(關於此範例,請參閱 DynamoDB 入門。) 下列範例會使用 DynamoDB MOVIES 表格中的資料載入 Amazon Redshift 資料表。Amazon Redshift 資料表必須已存在於資料庫中。

copy favoritemovies from 'dynamodb://Movies' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' readratio 50;

LISTING從 Amazon S3 存儲桶加載

下列範例會LISTING從 Amazon S3 儲存貯體載入。此命COPY令會載入/data/listing/資料夾中的所有檔案。

copy listing from 's3://amzn-s3-demo-bucket/data/listing/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

LISTING從 Amazon EMR 群集加載

下列範例會從 Amazon 叢集中的 lzop-壓縮檔案中使用Tab 字元分隔的資料載入資料SALES表。EMRCOPY載入myoutput/資料夾中以開頭的每個檔案part-

copy sales from 'emr://j-SAMPLE2B500FC/myoutput/part-*' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '\t' lzop;

下列範例會在 Amazon EMR 叢集中載入含有SALESJSON格式化資料的表格。COPY載入myoutput/json/資料夾中的每個檔案。

copy sales from 'emr://j-SAMPLE2B500FC/myoutput/json/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' JSON 's3://amzn-s3-demo-bucket/jsonpaths.txt';

使用資訊清單指定資料檔案

您可以使用資訊清單確保COPY命令從 Amazon S3 載入所有必要的檔案,而且只載入必要的檔案。需要從不同儲存貯體載入多個檔案,或載入不共用相同字首的檔案時,您也可以使用資訊清單。

例如,假設您需要載入下列三個檔案:custdata1.txtcustdata2.txtcustdata3.txt。您可以使用下列命令指定字首,以載入 amzn-s3-demo-bucket 中開頭為 custdata 的所有檔案:

copy category from 's3://amzn-s3-demo-bucket/custdata' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

如果只有兩個檔案因為發生錯誤而存在,則只COPY載入這兩個檔案並成功完成,導致資料載入不完整。如果存儲桶還包含不需要的文件,而該文件恰好使用相同的前綴(custdata.backup例如命名的文件),則還會加COPY載該文件,從而導致不需要的數據被加載。

若要確保載入所有必要檔案並防止載入不需要的檔案,您可以使用資訊清單檔案。清單是一個JSON格式化的文本文件,其中列出了COPY命令要處理的文件。例如,下列資訊清單會載入上述範例中的三個檔案。

{ "entries":[ { "url":"s3://amzn-s3-demo-bucket/custdata.1", "mandatory":true }, { "url":"s3://amzn-s3-demo-bucket/custdata.2", "mandatory":true }, { "url":"s3://amzn-s3-demo-bucket/custdata.3", "mandatory":true } ] }

可選mandatory標誌指示是否COPY應該終止,如果該文件不存在。預設值為 false。無論任何必要設定為何,如果找不到檔案,都COPY會終止。在此範例中,如果找不到任何檔案,就會COPY傳回錯誤。如果您僅指定金鑰前綴 (例如 custdata.backup),則可能已挑選的不必要檔案會被忽略,因為這些檔案不在資訊清單上。

從資料檔案中載入ORC或 Parquet 格式時,需要meta欄位,如下列範例所示。

{ "entries":[ { "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata", "mandatory":true, "meta":{ "content_length":99 } }, { "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata", "mandatory":true, "meta":{ "content_length":99 } } ] }

以下範例使用名為 cust.manifest 的資訊清單。

copy customer from 's3://amzn-s3-demo-bucket/cust.manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as orc manifest;

您可以使用資訊清單從不同儲存貯體載入檔案,或載入不共用相同字首的檔案。下列範例顯示如JSON何載入檔案名稱以日期戳記開頭的資料。

{ "entries": [ {"url":"s3://amzn-s3-demo-bucket/2013-10-04-custdata.txt","mandatory":true}, {"url":"s3://amzn-s3-demo-bucket/2013-10-05-custdata.txt","mandatory":true}, {"url":"s3://amzn-s3-demo-bucket/2013-10-06-custdata.txt","mandatory":true}, {"url":"s3://amzn-s3-demo-bucket/2013-10-07-custdata.txt","mandatory":true} ] }

只要值區與叢集位於相同區域,資訊清單就可以列出位於不同值 AWS 區中的檔案。

{ "entries": [ {"url":"s3://amzn-s3-demo-bucket1/custdata1.txt","mandatory":false}, {"url":"s3://amzn-s3-demo-bucket2/custdata1.txt","mandatory":false}, {"url":"s3://amzn-s3-demo-bucket2/custdata2.txt","mandatory":false} ] }

LISTING從以管道分隔的檔案載入 (預設分隔符號)

下列範例是非常簡單的案例,其中沒有指定任何選項,且輸入檔案包含預設分隔符號,即縱線字元 ('|')。

copy listing from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

LISTING使用鑲木地板格式的欄式資料載入

下列範例從 Amazon S3 上名為 parquet 的資料夾載入資料。

copy listing from 's3://amzn-s3-demo-bucket/data/listings/parquet/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as parquet;

LISTING使用格式的單欄式資料載入 ORC

下列範例從 Amazon S3 上名為 orc 的資料夾載入資料。

copy listing from 's3://amzn-s3-demo-bucket/data/listings/orc/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as orc;

EVENT使用選項加載

下列範例會將以管道分隔的資料載入資料EVENT表,並套用下列規則:

  • 如果使用成對的引號來括住任何字元字串,則會移除引號。

  • 空字串和包含空白的字串都會載入為NULL值。

  • 如果傳回 5 個以上的錯誤,載入會失敗。

  • 時間戳記值必須符合指定的格式;例如,有效時間戳記為 2008-09-26 05:43:12

copy event from 's3://amzn-s3-demo-bucket/data/allevents_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' removequotes emptyasnull blanksasnull maxerror 5 delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS';

VENUE從固定寬度的資料檔載入

copy venue from 's3://amzn-s3-demo-bucket/data/venue_fw.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';

上述範例假設資料檔案的格式與所顯示的樣本資料相同。在下列樣本中,空格充當預留位置,讓所有欄都是規格所指明的相同寬度:

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

CATEGORY從CSV檔案載入

假設您要載入CATEGORY下表所示的值。

catid catgroup catname catdesc
12 Shows Musicals Musical theatre
13 Shows Plays All "non-musical" theatre
14 Shows Opera All opera, light, and "rock" opera
15 Concerts Classical All symphony, concerto, and choir concerts

下列範例顯示文字檔案的內容,欄位值以逗號分隔。

12,Shows,Musicals,Musical theatre 13,Shows,Plays,All "non-musical" theatre 14,Shows,Opera,All opera, light, and "rock" opera 15,Concerts,Classical,All symphony, concerto, and choir concerts

如果您使用DELIMITER參數載入檔案以指定逗號分隔的輸入,則指COPY令會失敗,因為某些輸入欄位包含逗號。您可以使用CSV參數並將包含逗號的欄位括在引號字元中,以避免此問題。如果引號括住的字串內出現引號字元,則需要多加一個引號字元才能將其逸出。預設引號字元是雙引號,所以您需要多加一個雙引號來逸出每一個雙引號。新的輸入檔案如下所示。

12,Shows,Musicals,Musical theatre 13,Shows,Plays,"All ""non-musical"" theatre" 14,Shows,Opera,"All opera, light, and ""rock"" opera" 15,Concerts,Classical,"All symphony, concerto, and choir concerts"

假設文件名是category_csv.txt,您可以使用以下COPY命令加載文件:

copy category from 's3://amzn-s3-demo-bucket/data/category_csv.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' csv;

或者,若要避免在輸入中逸出雙引號,您可以使用 QUOTE AS 參數來指定不同的引號字元。例如,下列的 category_csv.txt 版本使用 '%' 做為引號字元。

12,Shows,Musicals,Musical theatre 13,Shows,Plays,%All "non-musical" theatre% 14,Shows,Opera,%All opera, light, and "rock" opera% 15,Concerts,Classical,%All symphony, concerto, and choir concerts%

以下COPY命令使用 QUOTE AS 加載category_csv.txt

copy category from 's3://amzn-s3-demo-bucket/data/category_csv.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' csv quote as '%';

載VENUE入IDENTITY欄的明確值

下列範例假設建立資料VENUE表時,至少有一個資料行 (例如venueid資料行) 已指定為IDENTITY資料行。此指令會覆寫IDENTITY資料IDENTITY行的自動產生值的預設行為,而是從 venue.txt 檔案載入明確的值。使用 EXLICIT _ IDS 選項時,Amazon Redshift 不會檢查是否將重複IDENTITY值加載到表中。

copy venue from 's3://amzn-s3-demo-bucket/data/venue.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' explicit_ids;

TIME從以管道分隔的檔GZIP案載入

下列範例會從以管道分隔GZIP的檔案載入TIME資料表:

copy time from 's3://amzn-s3-demo-bucket/data/timerows.gz' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' gzip delimiter '|';

載入時間戳記或日期戳記

下列範例載入含有格式化時間戳記的資料。

注意

TIMEFORMAT的還HH:MI:SS可以支持小數秒超出SS到微秒級別的詳細信息。此範例中使用的檔案 time.txt 包含一列,即 2009-01-12 14:15:57.119568

copy timestamp1 from 's3://amzn-s3-demo-bucket/data/time.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' timeformat 'YYYY-MM-DD HH:MI:SS';

此複製的結果如下所示:

select * from timestamp1; c1 ---------------------------- 2009-01-12 14:15:57.119568 (1 row)

從含有預設值的檔案載入資料

下列範例會使用TICKIT資料庫中資料VENUE表的變體。考慮用下面的語句定義一個 VENUE _ NEW 表:

create table venue_new( venueid smallint not null, venuename varchar(100) not null, venuecity varchar(30), venuestate char(2), venueseats integer not null default '1000');

請考慮一個不包含資料行值的 venue_noseats.txt 資料檔案,如下VENUESEATS列範例所示:

1|Toyota Park|Bridgeview|IL| 2|Columbus Crew Stadium|Columbus|OH| 3|RFK Stadium|Washington|DC| 4|CommunityAmerica Ballpark|Kansas City|KS| 5|Gillette Stadium|Foxborough|MA| 6|New York Giants Stadium|East Rutherford|NJ| 7|BMO Field|Toronto|ON| 8|The Home Depot Center|Carson|CA| 9|Dick's Sporting Goods Park|Commerce City|CO| 10|Pizza Hut Park|Frisco|TX|

下列COPY陳述式會成功地從檔案載入資料表,並將DEFAULT值 ('1000') 套用至省略的資料欄:

copy venue_new(venueid, venuename, venuecity, venuestate) from 's3://amzn-s3-demo-bucket/data/venue_noseats.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

現在檢視已載入的資料表:

select * from venue_new order by venueid; venueid | venuename | venuecity | venuestate | venueseats ---------+----------------------------+-----------------+------------+------------ 1 | Toyota Park | Bridgeview | IL | 1000 2 | Columbus Crew Stadium | Columbus | OH | 1000 3 | RFK Stadium | Washington | DC | 1000 4 | CommunityAmerica Ballpark | Kansas City | KS | 1000 5 | Gillette Stadium | Foxborough | MA | 1000 6 | New York Giants Stadium | East Rutherford | NJ | 1000 7 | BMO Field | Toronto | ON | 1000 8 | The Home Depot Center | Carson | CA | 1000 9 | Dick's Sporting Goods Park | Commerce City | CO | 1000 10 | Pizza Hut Park | Frisco | TX | 1000 (10 rows)

在下列範例中,除了假設檔案中未包含任何VENUESEATS資料外,還假設未包含任何VENUENAME資料:

1||Bridgeview|IL| 2||Columbus|OH| 3||Washington|DC| 4||Kansas City|KS| 5||Foxborough|MA| 6||East Rutherford|NJ| 7||Toronto|ON| 8||Carson|CA| 9||Commerce City|CO| 10||Frisco|TX|

使用相同的資料表定義時,下列COPY陳述式會失敗,因為沒有為指定DEFAULT值VENUENAME,而且VENUENAME是NOTNULL資料行:

copy venue(venueid, venuecity, venuestate) from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

現在考慮使用IDENTITY列的VENUE表的變體:

create table venue_identity( venueid int identity(1,1), venuename varchar(100) not null, venuecity varchar(30), venuestate char(2), venueseats integer not null default '1000');

與前面的範例一樣,假設VENUESEATS資料行在來源檔案中沒有對應的值。下列COPY陳述式會成功載入資料表,包括預先定義的IDENTITY資料值,而非自動產生這些值:

copy venue(venueid, venuename, venuecity, venuestate) from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' explicit_ids;

這個陳述式失敗,因為它不包含IDENTITY資料行 (VENUEID資料行清單中遺失),但包含 EXPLICIT _ IDS 參數:

copy venue(venuename, venuecity, venuestate) from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' explicit_ids;

這個陳述式失敗,因為它不包含 EXPLICIT _ IDS 參數:

copy venue(venueid, venuename, venuecity, venuestate) from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

COPY數據與選ESCAPE項

下列範例示範如何載入符合分隔符號字元 (在此例子中是縱線字元) 的字元。在輸入檔案中,請確定您要載入的所有縱線字元 (|) 都以反斜線字元 (\) 逸出。然後使用ESCAPE參數載入檔案。

$ more redshiftinfo.txt 1|public\|event\|dwuser 2|public\|sales\|dwuser create table redshiftinfo(infoid int,tableinfo varchar(50)); copy redshiftinfo from 's3://amzn-s3-demo-bucket/data/redshiftinfo.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' escape; select * from redshiftinfo order by 1; infoid | tableinfo -------+-------------------- 1 | public|event|dwuser 2 | public|sales|dwuser (2 rows)

如果沒有ESCAPE參數,此COPY命令將失敗並顯示錯Extra column(s) found誤。

重要

如果您使用COPY帶ESCAPE參數的 a 載入資料,您也必須使用指UNLOAD令指定ESCAPE參數,以產生往復式輸出檔案。同樣,如果您UNLOAD使用ESCAPE參數,則需要在使用相同COPY的數據ESCAPE時使用。

從JSON範例複製

在下列範例中,您會以下列資料載入資料CATEGORY表。

CATID CATGROUP CATNAME CATDESC
1 運動 MLB 美國職棒大聯盟
2 運動 NHL National Hockey League
3 運動 NFL National Football League
4 運動 NBA National Basketball Association
5 Concerts Classical All symphony, concerto, and choir concerts

使用「auto」選項從JSON數據加載

若要使用'auto'選項從JSON資料載入,JSON資料必須由一組物件組成。金鑰名稱必須符合欄名稱,但順序並不重要。以下顯示一個名為 category_object_auto.json 之檔案的內容。

{ "catdesc": "Major League Baseball", "catid": 1, "catgroup": "Sports", "catname": "MLB" } { "catgroup": "Sports", "catid": 2, "catname": "NHL", "catdesc": "National Hockey League" }{ "catid": 3, "catname": "NFL", "catgroup": "Sports", "catdesc": "National Football League" } { "bogus": "Bogus Sports LLC", "catid": 4, "catgroup": "Sports", "catname": "NBA", "catdesc": "National Basketball Association" } { "catid": 5, "catgroup": "Shows", "catname": "Musicals", "catdesc": "All symphony, concerto, and choir concerts" }

若要從上一個範例中的JSON資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_object_auto.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 'auto';

使用「auto 忽略」選項從JSON數據加載

若要使用'auto ignorecase'選項從JSON資料載入,JSON資料必須由一組物件組成。索引鍵名稱的大小寫不必符合欄名稱,順序也不重要。以下顯示一個名為 category_object_auto-ignorecase.json 之檔案的內容。

{ "CatDesc": "Major League Baseball", "CatID": 1, "CatGroup": "Sports", "CatName": "MLB" } { "CatGroup": "Sports", "CatID": 2, "CatName": "NHL", "CatDesc": "National Hockey League" }{ "CatID": 3, "CatName": "NFL", "CatGroup": "Sports", "CatDesc": "National Football League" } { "bogus": "Bogus Sports LLC", "CatID": 4, "CatGroup": "Sports", "CatName": "NBA", "CatDesc": "National Basketball Association" } { "CatID": 5, "CatGroup": "Shows", "CatName": "Musicals", "CatDesc": "All symphony, concerto, and choir concerts" }

若要從上一個範例中的JSON資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 'auto ignorecase';

使用JSONPaths檔案從JSON資料載入

如果資JSON料物件不直接對應至欄名稱,您可以使用JSONPaths檔案將JSON元素對映至欄。順序在JSON源數據中無關緊要,但JSONPaths文件表達式的順序必須與列順序匹配。假設您有下列資料檔案,名稱為 category_object_paths.json

{ "one": 1, "two": "Sports", "three": "MLB", "four": "Major League Baseball" } { "three": "NHL", "four": "National Hockey League", "one": 2, "two": "Sports" } { "two": "Sports", "three": "NFL", "one": 3, "four": "National Football League" } { "one": 4, "two": "Sports", "three": "NBA", "four": "National Basketball Association" } { "one": 6, "two": "Shows", "three": "Musicals", "four": "All symphony, concerto, and choir concerts" }

以下名為category_jsonpath.json的JSONPaths檔案會將來源資料對應至表格資料行。

{ "jsonpaths": [ "$['one']", "$['two']", "$['three']", "$['four']" ] }

若要從上一個範例中的JSON資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_object_paths.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://amzn-s3-demo-bucket/category_jsonpath.json';

使用JSONPaths檔案從JSON陣列載入

若要從由一組陣列組成的JSON資料載入,您必須使用JSONPaths檔案將陣列元素對映至資料行。假設您有下列資料檔案,名稱為 category_array_data.json

[1,"Sports","MLB","Major League Baseball"] [2,"Sports","NHL","National Hockey League"] [3,"Sports","NFL","National Football League"] [4,"Sports","NBA","National Basketball Association"] [5,"Concerts","Classical","All symphony, concerto, and choir concerts"]

以下名為category_array_jsonpath.json的JSONPaths檔案會將來源資料對應至表格資料行。

{ "jsonpaths": [ "$[0]", "$[1]", "$[2]", "$[3]" ] }

若要從上一個範例中的JSON資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_array_data.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';

從 Avro 複製的範例

在下列範例中,您會以下列資料載入資料CATEGORY表。

CATID CATGROUP CATNAME CATDESC
1 運動 MLB 美國職棒大聯盟
2 運動 NHL National Hockey League
3 運動 NFL National Football League
4 運動 NBA National Basketball Association
5 Concerts Classical All symphony, concerto, and choir concerts

使用 'auto' 選項從 Avro 資料載入

若要使用 'auto' 引數從 Avro 資料載入,Avro 結構描述中的欄位名稱必須符合欄名稱。使用 'auto' 引數時,順序並不重要。以下顯示一個名為 category_auto.avro 之檔案的結構描述。

{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}

Avro 檔案中的資料是二進位格式,無法直接閱讀。以下顯JSON示了category_auto.avro文件中數據的表示。

{
   "catid": 1,
   "catdesc": "Major League Baseball",
   "catname": "MLB",
   "catgroup": "Sports"
}
{
   "catid": 2,
   "catdesc": "National Hockey League",
   "catname": "NHL",
   "catgroup": "Sports"
}
{
   "catid": 3,
   "catdesc": "National Basketball Association",
   "catname": "NBA",
   "catgroup": "Sports"
}
{
   "catid": 4,
   "catdesc": "All symphony, concerto, and choir concerts",
   "catname": "Classical",
   "catgroup": "Concerts"
}

若要從上一個範例中的 Avro 資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_auto.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as avro 'auto';

使用 'auto ignorecase' 選項從 Avro 資料載入

若要使用 'auto ignorecase' 引數從 Avro 資料載入,Avro 結構描述中欄位名稱的大小寫不必符合欄名稱的大小寫。使用 'auto ignorecase' 引數時,順序並不重要。以下顯示一個名為 category_auto-ignorecase.avro 之檔案的結構描述。

{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "CatID", "type": "int"},
        {"name": "CatDesc", "type": "string"},
        {"name": "CatName", "type": "string"},
        {"name": "CatGroup", "type": "string"},
}

Avro 檔案中的資料是二進位格式,無法直接閱讀。以下顯JSON示了category_auto-ignorecase.avro文件中數據的表示。

{
   "CatID": 1,
   "CatDesc": "Major League Baseball",
   "CatName": "MLB",
   "CatGroup": "Sports"
}
{
   "CatID": 2,
   "CatDesc": "National Hockey League",
   "CatName": "NHL",
   "CatGroup": "Sports"
}
{
   "CatID": 3,
   "CatDesc": "National Basketball Association",
   "CatName": "NBA",
   "CatGroup": "Sports"
}
{
   "CatID": 4,
   "CatDesc": "All symphony, concerto, and choir concerts",
   "CatName": "Classical",
   "CatGroup": "Concerts"
}

若要從上一個範例中的 Avro 資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_auto-ignorecase.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as avro 'auto ignorecase';

使用檔案從 Avro 資料載入 JSONPaths

如果 Avro 結構定義中的欄位名稱不直接對應至資料行名稱,您可以使用JSONPaths檔案將結構定義元素對應至資料行。JSONPaths檔案運算式的順序必須符合欄順序。

假設您有一個名為 category_paths.avro 的資料檔案,其中包含的資料與上述範例相同,但使用下列結構描述。

{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "desc", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "group", "type": "string"},
        {"name": "region", "type": "string"} 
     ]
}

以下名為category_path.avropath的JSONPaths檔案會將來源資料對應至表格資料行。

{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}

若要從上一個範例中的 Avro 資料檔案載入,請執行下列COPY命令。

copy category from 's3://amzn-s3-demo-bucket/category_object_paths.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format avro 's3://amzn-s3-demo-bucket/category_path.avropath ';

COPY使用ESCAPE選項準備檔案

下列範例說明如何在使用具有參數的COPY命令將資料匯入 Amazon Redshift 表格之前,準備資料以「逸出」換行字元。ESCAPE在不準備資料以分隔換行符號的情況下,Amazon Redshift 會在您執行COPY命令時傳回載入錯誤,因為換行字元通常用作記錄分隔符號。

例如,假設您想要將一個檔案或外部資料表中的一欄複製到 Amazon Redshift 資料表。如果檔案或資料行包含已XML格式化的內容或類似資料,您需要確定屬於內容一部分的所有換行字元 (\ n) 都會以反斜線字元 (\) 逸出。

包含內嵌換行字元的檔案或資料表可提供相當簡單的比對模式。每一個內嵌的換行字元很可能都接在 > 字元後面,且之間可能有幾個空格字元 (' ' 或 Tab 字元),如下列範例所示 (在名為 nlTest1.txt 的文字檔案中)。

$ cat nlTest1.txt <xml start> <newline characters provide> <line breaks at the end of each> <line in content> </xml>|1000 <xml> </xml>|2000

在下列範例中,您可以執行文字處理公用程式來預先處理來源檔案,並在需要的地方插入逸出字元。(當欄資料複製到 Amazon Redshift 資料表時,會將 | 字元主要做為分隔符號來分隔欄資料。)

$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt

同樣地,您可以使用 Perl 來執行類似的操作:

cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt

為了方便將 nlTest2.txt 檔案中的資料載入 Amazon Redshift,我們在 Amazon Redshift 中建立一個兩欄資料表。第一列 c1,是一個字符列,用於保存文件中的XML格式化內容。nlTest2.txt第二欄 c2 存放從同一個檔案載入的整數值。

執行sed命令之後,您可以使用ESCAPE參數將nlTest2.txt檔案中的資料正確載入 Amazon Redshift 表格中。

注意

當您在COPY指令中加入ESCAPE參數時,它會逸出一些包含反斜線字元 (包括換行符) 的特殊字元。

copy t2 from 's3://amzn-s3-demo-bucket/data/nlTest2.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' escape delimiter as '|'; select * from t2 order by 2; c1 | c2 -------------+------ <xml start> <newline characters provide> <line breaks at the end of each> <line in content> </xml> | 1000 <xml> </xml> | 2000 (2 rows)

您可以用類似的方法來準備從外部資料庫匯出的資料檔案。例如,對於 Oracle 資料庫,您可以在要複製到 Amazon Redshift 的表格中的每個受影響欄上使用此REPLACE函數。

SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml

此外,許多定期處理大量資料的資料庫匯出和擷取、轉換、load (ETL) 工具都提供了指定逸出和分隔符號字元的選項。

將 Shapefile 載入 Amazon Redshift

下面的例子演示了如何使用加載 Esri 形狀文件。COPY如需載入 Shapefile 的相關資訊,請參閱將 Shapefile 載入 Amazon Redshift

載入 Shapefile

下列步驟說明如何使用COPY命令從 Amazon S3 擷取 OpenStreetMap 資料。此範例假設 Geofabrik 下載網站中的挪威 shapefile 存檔已上傳到您區域中的私有 Amazon S3 儲存貯體。 AWS .shp.shx.dbf 檔案必須共用相同的 Amazon S3 字首和檔案名稱。

不使用簡化擷取資料

以下命令會建立資料表並擷取資料,這些資料無需任何簡化即可符合最大幾何大小。gis_osm_natural_free_1.shp在您偏好的GIS軟體中開啟,並檢查此圖層中的欄。默認情況下,IDENTITY或GEOMETRY列是第一個。當一GEOMETRY列是第一個,你可以創建表,如下圖所示。

CREATE TABLE norway_natural ( wkb_geometry GEOMETRY, osm_id BIGINT, code INT, fclass VARCHAR, name VARCHAR);

或者,當IDENTITY列是第一個,您可以創建表,如下所示。

CREATE TABLE norway_natural_with_id ( fid INT IDENTITY(1,1), wkb_geometry GEOMETRY, osm_id BIGINT, code INT, fclass VARCHAR, name VARCHAR);

現在,您可以使用COPY.

COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully

或者,您可以如下所示擷取資料。

COPY norway_natural_with_id FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural_with_id' completed, 83891 record(s) loaded successfully.

使用簡化擷取資料

下列命令會建立資料表並嘗試擷取資料,這些資料若不經簡化就無法符合最大幾何大小。檢查 gis_osm_water_a_free_1.shp Shapefile 並建立適當資料表,如下所示。

CREATE TABLE norway_water ( wkb_geometry GEOMETRY, osm_id BIGINT, code INT, fclass VARCHAR, name VARCHAR);

當命COPY令運行時,會導致錯誤。

COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; ERROR: Load into table 'norway_water' failed. Check 'stl_load_errors' system table for details.

查詢 STL_LOAD_ERRORS 顯示幾何太大。

SELECT line_number, btrim(colname), btrim(err_reason) FROM stl_load_errors WHERE query = pg_last_copy_id(); line_number | btrim | btrim -------------+--------------+----------------------------------------------------------------------- 1184705 | wkb_geometry | Geometry size: 1513736 is larger than maximum supported size: 1048447

為了解決這個問題,會將SIMPLIFY AUTO參數加入至指COPY令以簡化幾何圖形。

COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp' FORMAT SHAPEFILE SIMPLIFY AUTO CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_water' completed, 1989196 record(s) loaded successfully.

若要檢視已簡化的列和幾何,請查詢 SVL_SPATIAL_SIMPLIFY

SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id(); query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance -------+-------------+-------------------+--------------+------------+------------+---------------------- 20 | 1184704 | -1 | 1513736 | t | 1008808 | 1.276386653895e-05 20 | 1664115 | -1 | 1233456 | t | 1023584 | 6.11707814796635e-06

使用 SIMPLIFY AUTO max_tolerance 且公差低於自動計算的公差時,可能會導致擷取錯誤。在這種情況下,使MAXERROR用忽略錯誤。

COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp' FORMAT SHAPEFILE SIMPLIFY AUTO 1.1E-05 MAXERROR 2 CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_water' completed, 1989195 record(s) loaded successfully. INFO: Load into table 'norway_water' completed, 1 record(s) could not be loaded. Check 'stl_load_errors' system table for details.

SVL_SPATIAL_SIMPLIFY再次查詢以識別COPY未設法載入的記錄。

SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id(); query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance -------+-------------+-------------------+--------------+------------+------------+----------------- 29 | 1184704 | 1.1e-05 | 1513736 | f | 0 | 0 29 | 1664115 | 1.1e-05 | 1233456 | t | 794432 | 1.1e-05

在這個範例中,第一筆記錄無法容納,因此 simplified 欄顯示為 false。第二筆記錄在給定的公差範圍內載入。但是,最終大小大於使用自動計算的公差而不指定最大公差。

從壓縮的 Shapefile 載入

Amazon Redshift COPY 支持從壓縮的形狀文件中獲取數據。所有 Shapefile 元件必須具有相同的 Amazon S3 字首和相同的壓縮字尾。例如,假設您想要從上述範例中載入資料。在此情況下,gis_osm_water_a_free_1.shp.gzgis_osm_water_a_free_1.dbf.gzgis_osm_water_a_free_1.shx.gz 檔案必須共用相同的 Amazon S3 目錄。該COPY命令需要選GZIP項,並且子FROM句必須指定正確的壓縮文件,如下所示。

COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/compressed/gis_osm_natural_free_1.shp.gz' FORMAT SHAPEFILE GZIP CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully.

以不同的欄順序將資料載入到資料表中

如果您的資料表沒有將 GEOMETRY 作為第一欄,則可以使用欄映射將欄映射到目標資料表。例如,建立一個將 osm_id 指定為第一欄的資料表。

CREATE TABLE norway_natural_order ( osm_id BIGINT, wkb_geometry GEOMETRY, code INT, fclass VARCHAR, name VARCHAR);

然後使用欄映射擷取 Shapefile。

COPY norway_natural_order(wkb_geometry, osm_id, code, fclass, name) FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp' FORMAT SHAPEFILE CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName'; INFO: Load into table 'norway_natural_order' completed, 83891 record(s) loaded successfully.

將資料載入至具有地理欄的資料表

如果您有一個包含 GEOGRAPHY 欄的資料表,則首先擷取至 GEOMETRY 欄中,然後將物件轉換為 GEOGRAPHY 物件。例如,將 Shapefile 複製到 GEOMETRY 欄之後,請更改資料表以新增 GEOGRAPHY 資料類型的欄。

ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;

然後將幾何轉換為地理。

UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;

您也可以選擇捨棄 GEOMETRY 欄。

ALTER TABLE norway_natural DROP COLUMN wkb_geometry;

COPY帶有NOLOAD選項的命令

若要在實際載入資料之前驗證資料檔案,請搭配COPY指令使用該NOLOAD選項。Amazon Redshift 會剖析輸入檔案,並顯示發生的任何錯誤。下列範例會使用選NOLOAD項,而且沒有資料列實際載入資料表中。

COPY public.zipcode1 FROM 's3://amzn-s3-demo-bucket/mydata/zipcode.csv' DELIMITER ';' IGNOREHEADER 1 REGION 'us-east-1' NOLOAD CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole'; Warnings: Load into table 'zipcode1' completed, 0 record(s) loaded successfully.