将拒绝的数据保存到表中
配合使用 REJECTED DATA 参数和 AS TABLE 子句可指定要将拒绝的数据保存到的表。将拒绝的数据保存到文件与使用 AS TABLE 子句是互斥的。
使用 AS TABLE 子句时,Vertica 会创建一个新表(如果不存在表)或将其附加到现有表。如果加载期间未发生解析拒绝,则表示表存在但却为空。下次加载数据时,Vertica 会将任何拒绝的行插入到现有表中。
加载拒绝表是一种特殊类型的表,其功能和限制如下:
-
支持
SELECT语句 -
可以使用
DROP TABLE -
不能创建于
COPY语句之外 -
不支持 DML 和 DDL 活动
-
并非 K-safe
若要使拒绝表中的数据变得 K-safe,可执行下列操作之一:
-
编写一条
CREATE TABLE..AS语句,如下例:=> CREATE TABLE new_table AS SELECT * FROM rejected_table; -
创建一个表以存储拒绝的记录,并对新表运行
INSERT..SELECT操作
使用 COPY NO COMMIT
如果 COPY 语句包含选项 NO COMMIT 和 REJECTED DATA AS TABLE,并且 reject-table 尚不存在,则 Vertica 分析数据库会将拒绝数据表保存为 LOCAL TEMP 表,并返回一条指示正在创建 LOCAL TEMP 表的消息。
拒绝数据表对于提取-加载-转换工作流很有用,在这些工作流程中,您可能会更频繁地使用临时表。拒绝数据表可让您快速加载数据并确定无法加载的记录。如果您将数据加载到使用 ON COMMIT DELETE 子句创建的临时表,则不会提交 COPY 操作。
拒绝数据表记录的位置
使用
REJECTED DATA AS TABLE table_name 选项将拒绝的记录保存到表中时,表数据将保存到数据库数据子目录 RejectionTableData 中。例如,对于 VMart 数据库,表数据文件的位置为:
/home/dbadmin/VMart/v_vmart_node0001_data/RejectionTableData
拒绝数据表包括拒绝数据和拒绝(异常)原因以及其他数据列(在下面加以介绍)。Vertica 建议您定期删除不再需要的任何拒绝数据表。
查询拒绝数据表
如果在使用 COPY 加载数据时指定了拒绝数据表,则可在加载操作完成后查询该表,以获取有关拒绝数据的信息。例如:
-
创建
loader表:=> CREATE TABLE loader(a INT) CREATE TABLE -
使用
COPY加载值并将拒绝数据保存到表loader_rejects中:=> COPY loader FROM STDIN REJECTED DATA AS TABLE loader_rejects; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> 1 >> 2 >> 3 >> a >> \. -
加载数据后查询
loader表:=> SELECT * FROM loader; x --- 1 2 3 (3 rows) -
查询
loader_rejects表以查看其列行:=> SELECT * FROM loader_rejects; -[ RECORD 1 ]-------------+-------------------------------------------- node_name | v_vmart_node0001 file_name | STDIN session_id | v_vmart_node0001.example.-24016:0x3439 transaction_id | 45035996274080923 statement_id | 1 batch_number | 0 row_number | 4 rejected_data | a rejected_data_orig_length | 1 rejected_reason | Invalid integer format 'a' for column 1 (x)
拒绝数据表具有以下列:
导出拒绝记录表
您可以将列 rejected_data 的内容导出到文件以仅捕获在第一个 COPY 语句期间拒绝的数据。然后,更正文件中的数据,保存数据并加载更新后的文件。
要导出拒绝记录:
-
创建示例表:
=> CREATE TABLE t (i int); CREATE TABLE -
将数据直接复制到表,并使用一个表存储拒绝数据:
=> COPY t FROM STDIN REJECTED DATA AS TABLE t_rejects; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> 1 >> 2 >> 3 >> 4 >> a >> b >> c >> \. -
仅显示元组,并设置输出格式:
=> \t Showing only tuples. => \a Output format is unaligned. -
输出到文件:
=> \o rejected.txt => select rejected_data from t_rejects; => \o -
对已保存的文件使用
cat命令:=> \! cat rejected.txt a b c
文件存在后,您可以修复加载错误,并使用更正的文件作为 COPY 语句的加载输入。