示例
有关其他 COPY 示例,请参阅特定解析器的参考页,包括:DELIMITED、ORC、PARQUET、FJSONPARSER 和 FAVROPARSER。
指定字符串选项
将 COPY 与 FORMAT、DELIMITER、NULL 和 ENCLOSED BY 选项结合使用:
=> COPY public.customer_dimension (customer_since FORMAT 'YYYY')
FROM STDIN
DELIMITER ','
NULL AS 'null'
ENCLOSED BY '"';
将 COPY 与 DELIMITER 和 NULL 选项结合使用。此示例设置并引用输入文件的 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
-
S3:
s3://bucket/path
-
Google Cloud:
gs://bucket/path
-
Azure:
azb://account/container/path
注意
从 HDFS、S3、GCS 和 Azure 加载时默认使用 ON ANY NODE;无需进行指定。使用默认名称节点或名称服务加载存储在 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 支持遵循与给定文件系统上的文件名称相同的命名约定的命名管道。权限为 open
、write
和 close
。
创建命名管道 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