指定加载数据的位置
每个 COPY 语句都需要 FROM 子句来指示正在加载的一个或多个文件的位置,或者在使用用户定义的源时需要 SOURCE 子句。有关 SOURCE 子句的详细信息,请参阅参数。此部分介绍如何使用 FROM 子句。
从特定路径加载
使用 path-to-data 实参来指示要加载的一个或多个文件的位置。可以从以下位置加载数据:
-
本地文件系统。
-
NFS,通过本地文件系统上的挂载点。
-
S3 对象存储、Google Cloud Storage (GCS) 对象存储 和 Azure Blob 存储对象存储。如果要读取的数据文件位于使用服务器端加密的 S3 存储桶中,则可能需要设置其他参数。
-
HDFS 文件系统。如果要读取的数据文件位于使用 Kerberos 身份验证的 HDFS 群集中,Vertica 将使用当前用户的主体、会话
doAs
用户或会话委托令牌。有关这些选项的详细信息,请参阅访问已进行 Kerberize 的 HDFS 数据。
如果路径是 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 数据部分。