指定加载数据的位置

每个 COPY 语句都需要 FROM 子句来指示正在加载的一个或多个文件的位置,或者在使用用户定义的源时需要 SOURCE 子句。有关 SOURCE 子句的详细信息,请参阅参数。此部分介绍如何使用 FROM 子句。

从特定路径加载

使用 path-to-data 实参来指示要加载的一个或多个文件的位置。可以从以下位置加载数据:

如果路径是 URL,则必须对 '%' 字符使用 URL 编码。否则,可以使用 URL 编码('%NN',其中 NN 是两位十六进制数),但不是必需的。

从本地文件系统复制时,COPY 语句会在参与查询的每个节点上的相同位置查找文件。如果使用的是 NFS,则可以在每个节点上创建 NFS 挂载点。这样做可以使所有数据库节点均参与加载,以提高性能,而无需将文件复制到所有节点。

将 NFS 挂载点视为路径中的本地文件:

=> COPY sales FROM '/mount/sales.dat' ON ANY NODE;

可以在同一 COPY 语句中指定多个路径,如以下示例所示。

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

对于 HDFS 中的文件,可以指定名称服务 (hadoopNS)。在此示例中,COPY 语句是外部表定义的一部分:

=> CREATE EXTERNAL TABLE users (id INT, name VARCHAR(20))
    AS COPY FROM 'webhdfs://hadoopNS/data/users.csv';

如果 path-to-data 解析到本地文件系统上的存储位置,并且调用 COPY 的用户不是超级用户,则需要以下权限:

  • 存储位置必须使用 USER 选项来创建(参见 CREATE LOCATION)。

  • 用户必须已被授予对文件所在的存储位置的 READ 访问权限,如 GRANT(存储位置) 中所述。

Vertica 可防止符号链接允许未经授权的访问。

使用通配符 (glob) 加载

您可使用单个语句对共享目录中的大量文件调用 COPY,例如:

=> COPY myTable FROM '/data/manyfiles/*.dat' ON ANY NODE;

glob (*) 必须指示一组文件,而不是目录。如果 /data/manyfiles 包含任何子目录,则以下语句将失败:

=> COPY myTable FROM '/data/manyfiles/*' ON ANY NODE;

如果 /data/manyfiles 包含含有文件的子目录,则可以在子目录的路径中使用 glob:

=> COPY myTable FROM '/data/manyfiles/*/*' ON ANY NODE;

有时,目录结构会对数据进行分区,如以下示例所示:

path/created=2016-11-01/*
path/created=2016-11-02/*
path/created=2016-11-03/*
path/...

您仍可使用 glob 来读取数据,但也可以将分区值本身(在本例中为创建日期)读取为表列。请参阅分区文件路径

ON ANY NODE 子句中使用通配符可以扩展启动程序节点上的文件列表。此命令随后会在所有节点之间分发各个文件,以便跨整个群集平均分发 COPY 工作负载。ON ANY NODE 是除 Linux 之外的所有文件系统的默认值。

从 Vertica 客户端加载

使用 COPY LOCAL 将客户端系统上的文件加载到 Vertica 数据库。例如,要从本地客户端复制 GZIP 文件,请使用如下命令:

=> COPY store.store_dimension FROM LOCAL '/usr/files/my_data/input_file' GZIP;

可以使用逗号分隔的列表来加载相同压缩类型的多个文件。COPY LOCAL 随后会将这些文件连接到单个文件中,因此您不能在列表中合并具有不同压缩类型的文件。列出多个文件时,请确保指定每个输入文件的类型(如 BZIP),如下所示:

=>COPY simple_table FROM LOCAL 'input_file.bz' BZIP, 'input_file.bz' BZIP;

您可以使用 STDIN 从本地客户端加载数据,如下所示:

=> COPY simple_table FROM LOCAL STDIN;

从 Kafka 或 Spark 加载

有关从 Kafka 流式数据传输的信息,请参阅 Apache Kafka 集成

有关将 Vertica 与 Spark 数据结合使用的信息,请参阅 Apache Spark 集成

从 IDOL CFS 客户端加载数据

IDOL Connector Framework Server (CFS) VerticaIndexer 功能允许 CFS 客户端使用 ODBC 连接到您的 Vertica 数据库。连接该数据库后,CFS 会使用 COPY...FROM LOCAL 语句将 IDOL 文档元数据加载到现有 Flex 表中。有关详细信息,请参阅“使用 Flex 表”中的将 Flex 表用于 IDOL 数据部分。