Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

COPY 示例

注意

为便于阅读,这些示例包含换行符。请不要在您的 credentials-args 字符串中包含换行符或空格。

从 DynamoDB 表加载 FAVORITEMOVIES

AWS 软件开发工具包包含一个创建名为 Movies 的 DynamoDB 表的简单示例。(如需查看此示例,请参阅 DynamoDB 入门。)以下示例加载包含 DynamoDB 表中数据的 Amazon Redshift MOVIES 表。Amazon Redshift 表必须已经存在于数据库中。

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

从 Amazon S3 存储桶加载 LISTING

以下示例从 Amazon S3 存储桶加载 LISTING。COPY 命令将加载 /data/listing/ 文件夹中的所有文件。

Copy
copy listing from 's3://mybucket/data/listing/' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

从 Amazon EMR 群集加载 LISTING

以下示例从 Amazon EMR 群集的 lzop 压缩文件加载使用制表符分隔数据的 SALES 表。COPY 将加载 myoutput/ 文件夹中每个以 part- 开头的文件。

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

以下示例将加载包含 Amazon EMR 群集中的 JSON 格式的数据的 SALES 表。COPY 将加载 myoutput/json/ 文件夹中的所有文件。

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

使用清单指定数据文件

您可以使用清单确保 COPY 命令将从 Amazon S3 加载所有必需的文件,而且仅加载必需的文件。当您需要从不同的存储桶加载多个文件或加载未共享相同前缀的文件时,您也可使用清单。

例如,假设您需要加载下列三个文件:custdata1.txtcustdata2.txtcustdata3.txt。您可使用以下命令通过指定前缀来加载 mybucket 中以 custdata 开头的所有文件:

Copy
copy category from 's3://mybucket/custdata' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

如果由于错误仅存在两个文件,则 COPY 将仅加载这两个文件并成功完成,从而导致不完整的数据加载。如果存储桶还包含恰巧使用相同前缀的不需要的文件(例如名为 custdata.backup 的文件),则 COPY 还将加载此文件,从而导致加载不需要的数据。

为了确保加载所有必需的文件并防止加载不需要的文件,您可使用清单文件。清单是 JSON 格式的文本文件,其中列出了要通过 COPY 命令处理的文件。例如,以下清单将加载上例中的三个文件。

Copy
{ "entries": [ {"url":"s3://mybucket/custdata.1","mandatory":true}, {"url":"s3://mybucket/custdata.2","mandatory":true}, {"url":"s3://mybucket/custdata.3","mandatory":true} ] }

可选的 mandatory 标志指示 COPY 是否应在文件不存在时终止。默认为 false。如果未找到任何文件,则无论 mandatory 设置如何,COPY 都将终止。在此示例中,如果未找到任何文件,COPY 将返回错误。将忽略可能会在仅指定键前缀(如 custdata.backup)的情况下选取的不需要的文件,因为它们不在清单上。

以下示例使用上例中名为 cust.manifest 的清单。

Copy
copy customer from 's3://mybucket/cust.manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' manifest;

您可以使用清单来加载不同存储桶或文件中的未共享相同前缀的文件。以下示例显示了用于加载名称以日期戳开头的文件中的数据的 JSON。

Copy
{ "entries": [ {"url":”s3://mybucket/2013-10-04-custdata.txt","mandatory":true}, {"url":”s3://mybucket/2013-10-05-custdata.txt”,"mandatory":true}, {"url":”s3://mybucket/2013-10-06-custdata.txt”,"mandatory":true}, {"url":”s3://mybucket/2013-10-07-custdata.txt”,"mandatory":true} ] }

此清单可列出位于不同存储桶中的文件,前提是存储桶与群集位于同一区域。

Copy
{ "entries": [ {"url":"s3://mybucket-alpha/custdata1.txt","mandatory":false}, {"url":"s3://mybucket-beta/custdata1.txt","mandatory":false}, {"url":"s3://mybucket-beta/custdata2.txt","mandatory":false} ] }

从用竖线分隔的文件(默认分隔符)加载 LISTING

以下示例是一个非常简单的示例,其中未指定任何选项并且输入文件包含默认分隔符,即竖线字符(“|”)。

Copy
copy listing from 's3://mybucket/data/listings_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';

使用临时凭证加载 LISTING

以下示例使用 SESSION_TOKEN 参数指定临时会话凭证:

Copy
copy listing from 's3://mybucket/data/listings_pipe.txt' access_key_id '<access-key-id>' secret_access_key '<secret-access-key' session_token '<temporary-token>';

使用选项加载 EVENT

以下示例将竖线分隔的数据加载到 EVENT 表中并应用下列规则:

  • 如果使用了引号对来括起任何字符串,则会删除它们。

  • 空字符串和包含空白的字符串将作为 NULL 值加载。

  • 如果返回了 5 个以上的错误,加载将失败。

  • 时间戳值必须遵循指定的格式;例如,有效的时间戳为 2008-09-26 05:43:12

Copy
copy event from 's3://mybucket/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
copy venue from 's3://mybucket/data/venue_fw.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';

上例假设数据文件与所示的示例数据是使用相同的方式设置格式的。在下面的示例中,空格充当占位符,以便所有列的宽度与规范中的规定相同:

Copy
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

从 CSV 文件加载 CATEGORY

假设您要加载具有下表中所示值的 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

以下示例显示了字段值用逗号隔开的文本文件的内容。

Copy
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 参数并将包含逗号的字段括在引号字符中来避免以上问题。如果用引号括起来的字符串中出现引号字符,则需要通过双引号字符来进行转义。默认引号字符为双引号,因此您需要使用一个额外的双引号对每个双引号进行转义。您的新输入文件与下面类似。

Copy
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
copy category from 's3://mybucket/data/category_csv.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' csv;

或者,若要避免对输入中的双引号进行转义,可通过使用 QUOTE AS 参数来指定其他引号字符。例如,以下版本的 category_csv.txt 使用“%”作为引号字符:

Copy
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
copy category from 's3://mybucket/data/category_csv.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' csv quote as '%';

加载包含 IDENTITY 列的显式值的 VENUE

以下示例假设在创建 VENUE 表时,至少将一个列(如 venueid 列)指定为 IDENTITY 列。此命令将覆盖 IDENTITY 列的自动生成值的默认 IDENTITY 行为,并将改为从 venue.txt 文件加载显式值。

Copy
copy venue from 's3://mybucket/data/venue.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' explicit_ids;

从用竖线分隔的 GZIP 文件加载 TIME

以下示例从用竖线分隔的 GZIP 文件加载 TIME 表:

Copy
copy time from 's3://mybucket/data/timerows.gz' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' gzip delimiter '|';

加载时间戳或日期戳

以下示例加载具有带格式的时间戳的数据。

注意

HH:MI:SS 的 TIMEFORMAT 还可支持超出 SS 的高达微秒细节级别的小数秒。此示例中使用的文件 time.txt 包含一行,即 2009-01-12 14:15:57.119568

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

此复制的结果如下所示:

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

从具有默认值的文件加载数据

以下示例使用 TICKIT 数据库中的 VENUE 表的变体。考虑使用以下语句定义的 VENUE_NEW 表:

Copy
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');

考虑未包含任何 VENUESEATS 列值的 venue_noseats.txt 数据文件,如以下示例中所示:

Copy
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
copy venue_new(venueid, venuename, venuecity, venuestate) from 's3://mybucket/data/venue_noseats.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|';

现在查看加载的表:

Copy
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 数据:

Copy
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 语句将失败,因为未为 VENUENAME 指定任何 DEFAULT 值,并且 VENUENAME 是一个非 NULL 列:

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

现在考虑使用 IDENTITY 列的 VENUE 表的变体:

Copy
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
copy venue(venueid, venuename, venuecity, venuestate) from 's3://mybucket/data/venue_pipe.txt' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' delimiter '|' explicit_ids;

此语句将失败,因为它未包含 IDENTITY 列(列列表中缺少 VENUEID),而是包含 EXPLICIT_IDS 参数:

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

此语句将失败,因为它不包含 EXPLICIT_IDS 参数:

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

使用 ESCAPE 选项复制数据

以下示例演示如何加载与分隔符字符(在此示例中为竖线字符)匹配的字符。在输入文件中,确保使用反斜杠字符 (\) 转义您要加载的所有竖线字符 (|)。然后使用 ESCAPE 参数加载此文件。

Copy
$ more redshiftinfo.txt 1|public\|event\|dwuser 2|public\|sales\|dwuser create table redshiftinfo(infoid int,tableinfo varchar(50)); copy redshiftinfo from 's3://mybucket/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 错误。

重要

如果使用包含 ESCAPE 参数的 COPY 加载数据,则还必须在 UNLOAD 命令中指定 ESCAPE 参数与以生成反向输出文件。同样,如果您使用 ESCAPE 参数执行 UNLOAD 命令,则在您对相同数据执行 COPY 操作时将需要使用 ESCAPE 参数。

从 JSON 复制的示例

在以下示例中,您将加载具有以下数据的 CATEGORY 表。

CATID CATGROUP CATNAME CATDESC
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

使用 'auto' 选项从 JSON 数据加载

要使用 'auto' 参数从 JSON 数据加载,JSON 数据必须包含一组对象。键名称必须与列名称匹配,但在这种情况下,顺序不重要。下面显示了名为 category_object_auto.json 的文件的内容。

Copy
{ "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
copy category from 's3://mybucket/category_object_auto.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 'auto';

使用 JSONPaths 文件从 JSON 数据加载

如果 JSON 数据对象未直接对应于列名称,则可使用 JSONPaths 文件将 JSON 元素映射到列。同样,顺序在 JSON 源数据中不重要,但 JSONPaths 文件表达式的顺序必须与列顺序匹配。假设您具有以下名为 category_object_paths.json 的数据文件。

Copy
{ "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 文件会将源数据映射到表列。

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

若要从上例中的 JSON 数据文件加载,请执行以下 COPY 命令。

Copy
copy category from 's3://mybucket/category_object_paths.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://mybucket/category_jsonpath.json';

使用 JSONPaths 文件从 JSON 数组加载

若要从包含一组数组的 JSON 数据加载,必须使用 JSONPaths 文件将数组元素映射到列。假设您具有以下名为 category_array_data.json 的数据文件。

Copy
[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 文件会将源数据映射到表列。

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

若要从上例中的 JSON 数据文件加载,请执行以下 COPY 命令。

Copy
copy category from 's3://mybucket/category_array_data.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' json 's3://mybucket/category_array_jsonpath.json';

从 Avro 复制的示例

在以下示例中,您将加载具有以下数据的 CATEGORY 表。

CATID CATGROUP CATNAME CATDESC
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

使用 'auto' 选项从 Avro 数据加载

若要使用 'auto' 参数从 Avro 数据加载,Avro schema 中的字段名称必须与列名称匹配。但是,在使用 'auto' 参数时,顺序不重要。下面显示了名为 category_auto.avro 的文件的 schema。

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

Avro 文件中的数据为二进制格式,因此不是人类可读的格式。下面显示了 category_auto.avro 文件中的数据的 JSON 表示形式。

{ "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
copy category from 's3://mybucket/category_auto.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as avro 'auto';

使用 JSONPaths 文件从 Avro 数据加载

如果 Avro schema 中的字段名称未直接对应于列名称,则可使用 JSONPaths 文件将 schema 元素映射到列。JSONPaths 文件表达式的顺序必须与列顺序一致。

假设您具有名为 category_paths.avro 的数据文件,其中包含的数据与上例相同,但具有以下 schema。

{ "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
copy category from 's3://mybucket/category_object_paths.avro' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format avro 's3://mybucket/category_path.avropath ';

针对包含 ESCAPE 选项的 COPY 准备文件

以下示例描述了在使用包含 ESCAPE 参数的 COPY 命令将数据导入到 Amazon Redshift 表中之前,如何准备数据以“转义”换行符。如果未准备数据以限定换行符,则 Amazon Redshift 将会在您运行 COPY 命令时返回加载错误,因为换行符一般用作记录分隔符。

例如,考虑要复制到 Amazon Redshift 表中的一个文件或外部表中的一个列。如果该文件或列包含 XML 格式的内容或类似数据,则需要确保使用反斜杠字符 (\) 转义此内容中的所有换行符 (\n)。

包含嵌入换行符的文件或表的一个好处是,它提供了相对轻松的匹配模式。每个嵌入的换行符很有可能始终跟随一个 > 字符(在这二者之间可能还包含一些空格字符(' ' 或制表符)),如下面的名为 nlTest1.txt 的文本文件的示例中所示。

Copy
$ 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 表中后分隔这些数据。)

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

同样,可使用 Perl 执行类似操作:

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

为了便于将 nlTest2.txt 文件中的数据加载到 Amazon Redshift 中,我们在 Amazon Redshift 中创建了一个两列表格。第一列 c1 是字符列,将用于放置 nlTest2.txt 文件中 XML 格式的内容。第二列 c2 将放置从同一文件加载的整数值。

在运行 sed 命令后,可使用 ESCAPE 参数将 nlTest2.txt 文件中的数据正确地加载到 Amazon Redshift 表中。

注意

如果您在 COPY 命令中包含 ESCAPE 参数,则它会将一些包含反斜杠字符的特殊字符(包括换行符)进行转义。

Copy
copy t2 from 's3://mybucket/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 函数。

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

此外,许多用于定期处理大量数据的数据库导出和提取、转换、加载 (ETL) 工具提供了指定转义字符和分隔符字符的选项。