将拒绝的数据保存到表中
配合使用 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
语句的加载输入。