COPY 拒绝数据和异常文件

当执行 COPY 语句并且并行处理为 ON(默认设置)时,COPY 创建单独的线程来处理加载文件。通常,线程的数量取决于系统中节点核心的数量。每个节点处理部分加载数据。如果加载总体成功,在加载处理期间发生的所有解析器拒绝都会写入到该节点的特定拒绝数据以及异常文件中。如果加载失败,则拒绝数据文件内容可能不完整或为空。如果您未明确指定文件名,则 COPY 会对拒绝数据文件使用默认名称和位置。请参阅下一个主题以指定您自己的拒绝数据和异常文件。

拒绝数据和异常文件都会保存并存储在每个节点上。此示例将多个文件用作 COPY 输入。由于语句不包括 REJECTED DATAEXCEPTIONS 参数,拒绝数据和异常文件都会写入每个节点的默认位置,即数据库编录子目录 CopyErrorLogs

\set dir `pwd`/data/ \set remote_dir /vertica/test_dev/tmp_ms/
\set file1 '''':dir'C1_large_tbl.dat'''
\set file2 '''':dir'C2_large_tbl.dat'''
\set file3 '''':remote_dir'C3_large_tbl.dat'''
\set file4 '''':remote_dir'C4_large_tbl.dat'''
=>COPY large_tbl FROM :file1 ON site01,:file2 ON site01,
               :file3 ON site02,
               :file4 ON site02
               DELIMITER '|';

指定拒绝的数据和异常文件

使用可选的 COPY REJECTED DATAEXCEPTIONS 参数 'path' 元素可以指定用来存储文件的非默认路径。

如果 path 解析到存储位置,并且调用 COPY 的用户不是超级用户,则需要以下权限:

两个参数也具有可使用指定路径的可选 ONnodename 子句:

...[ EXCEPTIONS 'path' [ ON nodename ] [, ...] ]...[ REJECTED DATA 'path' [ ON nodename ] [, ...] ]

使用 'path' 指定拒绝数据和异常文件(及其相应的参数)的位置时,可选的 ONnodename 子句会将节点上的任何现有拒绝数据和异常文件移动到同一个节点上的指定路径。

将拒绝数据和异常文件保存到单个服务器

COPY 处理完成后,COPY 语句并无可合并异常和拒绝数据文件的功能。查看异常和拒绝数据文件的内容时,需要访问每个节点的特定文件。

将 VSQL 变量用于拒绝数据和异常文件

此示例使用了 vsql 变量来指定要与 exceptionsrejected data 参数(except_s1reject_s1)一起使用的路径和文件名。COPY 语句在启动程序节点上指定了单个输入文件 (large_tbl):

\set dir `pwd`/data/ \set file1 '''':dir'C1_large_tbl.dat'''
\set except_s1 '''':dir'exceptions'''
\set reject_s1 '''':dir'rejections'''

COPY large_tbl FROM :file1 ON site01 DELIMITER '|'
REJECTED DATA :reject_s1 ON site01
EXCEPTIONS :except_s1 ON site01;

此示例使用变量指定了远程节点上的异常和拒绝数据文件(except_s2reject_s2)。COPY 语句包含远程节点上的单个输入文件 (site02):

\set remote_dir /vertica/test_dev/tmp_ms/\set except_s2 '''':remote_dir'exceptions'''
\set reject_s2 '''':remote_dir'rejections'''

COPY large_tbl FROM :file1 ON site02 DELIMITER '|'
REJECTED DATA :reject_s2 ON site02
EXCEPTIONS :except_s2 ON site02;

此示例使用变量来指定异常和拒绝数据文件位于远程节点上(由 :remote_dir 指示)。COPY 语句的输入包括两个节点(site01site02)上的多个数据文件。exceptionsrejected data 选项使用了具有变量的 ON nodename 子句来指示文件的驻留位置(site01site02):

\set dir `pwd`/data/ \set remote_dir /vertica/test_dev/tmp_ms/
\set except_s1 '''':dir''''
\set reject_s1 '''':dir''''
\set except_s2 '''':remote_dir''''
\set reject_s2 '''':remote_dir''''
COPY large_tbl FROM :file1 ON site01,
               :file2 ON site01,
               :file3 ON site02,
               :file4 ON site02
               DELIMITER '|'
               REJECTED DATA :reject_s1 ON site01, :reject_s2 ON site02
               EXCEPTIONS :except_s1 ON site01, :except_s2 ON site02;