示例

有关其他 COPY 示例,请参阅特定解析器的参考页,包括:DELIMITEDORCPARQUETFJSONPARSERFAVROPARSER

指定字符串选项

将 COPY 与 FORMATDELIMITERNULLENCLOSED BY 选项结合使用:

=> COPY public.customer_dimension (customer_since FORMAT 'YYYY')
   FROM STDIN
   DELIMITER ','
   NULL AS 'null'
   ENCLOSED BY '"';

将 COPY 与 DELIMITERNULL 选项结合使用。此示例设置并引用输入文件的 vsql 变量:

=> \set input_file ../myCopyFromLocal/large_table.gzip
=> COPY store.store_dimension
   FROM :input_file
   DELIMITER '|'
   NULL ''
   RECORD TERMINATOR E'\f';

包括多个源文件

创建一个表,然后将多个源文件复制到其中:

=> CREATE TABLE sampletab (a int);
CREATE TABLE

=> COPY sampletab FROM '/home/dbadmin/one.dat', 'home/dbadmin/two.dat';
 Rows Loaded
-------------
           2
(1 row)

使用通配符表示一组文件:

=> COPY myTable FROM 'webhdfs:///mydirectory/ofmanyfiles/*.dat';

通配符可以包含正则表达式:

=> COPY myTable FROM 'webhdfs:///mydirectory/*_[0-9]';

使用单个 COPY 语句指定多个路径:

=> COPY myTable FROM 'webhdfs:///data/sales/01/*.dat', 'webhdfs:///data/sales/02/*.dat',
    'webhdfs:///data/sales/historical.dat';

分布加载

加载所有节点共享的数据。如果可能,Vertica 会将加载操作分布到所有节点:

=> COPY sampletab FROM '/data/file.dat' ON ANY NODE;

从两个文件中加载数据。因为第一个加载文件未指定节点(或 ON ANY NODE),因此启动程序将执行加载操作。将加载第二个文件的操作分布到所有节点:

=> COPY sampletab FROM '/data/file1.dat', '/data/file2.dat' ON ANY NODE;

为每个加载文件指定不同的节点:

=> COPY sampletab FROM '/data/file1.dat' ON (v_vmart_node0001, v_vmart_node0002),
    '/data/file2.dat' ON (v_vmart_node0003, v_vmart_node0004);

从共享存储中加载数据

要从共享存储中加载数据,请使用相应架构中的 URL:

  • HDFS[[s]web]hdfs://[nameservice]/path

  • S3s3://bucket/path

  • Google Cloudgs://bucket/path

  • Azureazb://account/container/path

使用默认名称节点或名称服务加载存储在 HDFS 中的文件:

=> COPY t FROM 'webhdfs:///opt/data/file1.dat';

通过特定的 HDFS 名称服务 (testNS) 加载数据。如果数据库配置为从多个 HDFS 群集中读取,则可以指定一个名称服务:

=> COPY t FROM 'webhdfs://testNS/opt/data/file2.csv';

从 S3 存储桶中加载数据:

=> COPY t FROM 's3://AWS_DataLake/*' ORC;

分区数据

可以使用目录结构对数据文件进行分区,例如:

path/created=2016-11-01/region=northeast/*
path/created=2016-11-01/region=central/*
path/created=2016-11-01/region=southeast/*
path/created=2016-11-01/...
path/created=2016-11-02/region=northeast/*
path/created=2016-11-02/region=central/*
path/created=2016-11-02/region=southeast/*
path/created=2016-11-02/...
path/created=2016-11-03/...
path/...

使用 PARTITION COLUMNS 选项加载分区列:

=> CREATE EXTERNAL TABLE records (id int, name varchar(50), created date, region varchar(50))
   AS COPY FROM 'webhdfs:///path/*/*/*'
   PARTITION COLUMNS created, region;

使用填充内容列

在以下示例中,该表包含名字、姓氏和全名列,但正在加载的数据包含名字、中间名和姓氏列。COPY 语句读取所有源数据,但只加载名字和姓氏的源列。它通过连接每个源数据列(包括中间名)来构造全名数据。中间名被读取为 FILLER 列,因此可以在串联中使用,但在其他情况下会被忽略。(中间名没有表格列。)

=> CREATE TABLE names(first VARCHAR(20), last VARCHAR(20), full VARCHAR(60));
CREATE TABLE
=> COPY names(first,
              middle FILLER VARCHAR(20),
              last,
              full AS first||' '||middle||' '||last)
      FROM STDIN;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> Marc|Gregory|Smith
>> Sue|Lucia|Temp
>> Jon|Pete|Hamilton
>> \.
=> SELECT * from names;
 first |   last   |        full
-------+----------+--------------------
 Jon   | Hamilton | Jon Pete Hamilton
 Marc  | Smith    | Marc Gregory Smith
 Sue   | Temp     | Sue Lucia Temp
(3 rows)

将数据加载到 Flex 表中

创建一个 Flex 表并使用 FJSONPARSER 将 JSON 数据复制到其中:

=> CREATE FLEX TABLE darkdata();
CREATE TABLE
=> COPY tweets FROM '/myTest/Flexible/DATA/tweets_12.json' PARSER FJSONPARSER();
 Rows Loaded
-------------
          12
(1 row)

使用命名管道

COPY 支持遵循与给定文件系统上的文件名称相同的命名约定的命名管道。权限为 openwriteclose

创建命名管道 pipe1,并设置两个 vsql 变量:

=> \! mkfifo  pipe1
=> \set dir `pwd`/
=> \set file '''':dir'pipe1'''

从命名管道中复制一个未压缩的文件:

=> \! cat pf1.dat > pipe1 &
=> COPY large_tbl FROM :file delimiter '|';
=> SELECT * FROM large_tbl;
=> COMMIT;

加载压缩数据

从命名管道中复制一个 GZIP 文件并解压缩:

=> \! gzip pf1.dat
=> \! cat pf1.dat.gz > pipe1 &
=> COPY large_tbl FROM :file ON site01 GZIP delimiter '|';
=> SELECT * FROM large_tbl;
=> COMMIT;
=> \!gunzip pf1.dat.gz