将拒绝的数据保存到表中

配合使用 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 COMMITREJECTED 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 加载数据时指定了拒绝数据表,则可在加载操作完成后查询该表,以获取有关拒绝数据的信息。例如:

  1. 创建 loader 表:

    => CREATE TABLE loader(a INT)
    CREATE TABLE
    
  2. 使用 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
    >> \.
    
  3. 加载数据后查询 loader 表:

    => SELECT * FROM loader;
     x
    ---
     1
     2
     3
    (3 rows)
    
  4. 查询 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 语句期间拒绝的数据。然后,更正文件中的数据,保存数据并加载更新后的文件。

要导出拒绝记录:

  1. 创建示例表:

    => CREATE TABLE t (i int);
    CREATE TABLE
    
  2. 将数据直接复制到表,并使用一个表存储拒绝数据:

    => 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
    >> \.
    
  3. 仅显示元组,并设置输出格式:

    => \t
    Showing only tuples.
    => \a
    Output format is unaligned.
    
  4. 输出到文件:

    => \o rejected.txt
    => select rejected_data from t_rejects;
    => \o
    
  5. 对已保存的文件使用 cat 命令:

    
    => \! cat rejected.txt
    a
    b
    c
    

文件存在后,您可以修复加载错误,并使用更正的文件作为 COPY 语句的加载输入。