固定宽度格式数据

使用 FIXEDWIDTH 解析器选项可批量加载固定宽度数据。必须指定 COLSIZES 选项值以指定每一列的字节数。所加载表的定义 (COPY table f (x, y, z)) 确定要声明的 COLSIZES 值的数量。

若要加载固定宽度数据,请使用 COLSIZES 选项指定每个输入列的字节数。如果任何记录都没有值,COPY 会插入一个或多个 null 字符以补齐指定字节数。固定宽度数据文件中的最后一条记录必须包含记录终止符,以确定加载数据的结尾。

以下 COPY 选项不受支持:

  • DELIMITER

  • ENCLOSED BY

  • ESCAPE AS

  • TRAILING NULLCOLS

在固定宽度数据中使用 null 值

用于固定宽度加载的默认 NULL 字符串不能为空字符串,应改用全部由空格组成的字符串。空格数取决于使用 COLSIZES (integer, [,...]) 选项声明的列宽度。

对于固定宽度加载,NULL 定义取决于是在列级别还是在语句级别指定 NULL:

  • 语句级别:必须将 NULL 定义为单字符。整个列宽度重复使用默认(或自定义)的 NULL 字符。

  • 列级别:必须将 NULL 定义为字符串,其长度与列宽度相匹配。

对于固定宽度加载,如果输入数据列的值数量少于指定列大小,COPY 会插入 NULL 字符。NULL 数量必须与声明的列宽度相匹配。如果您在列级别指定 NULL 字符串,COPY 会按照列宽度匹配字符串。

定义 null 字符(语句级别)

  1. 创建包含两个列的表 (fw):

    => CREATE TABLE fw(co int, ci int);
    CREATE TABLE
    
  2. 复制该表并将 NULL 指定为 'N',然后输入一些数据:

    => COPY fw FROM STDIN FIXEDWIDTH colsizes(2,2) null AS 'N' NO COMMIT;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> NN12
    >> 23NN
    >> NNNN
    >> nnnn
    >> \.
    
  3. 从表中选择所有 (*):

    => SELECT * FROM fw;
     co | ci
    ----+----
        | 12
     23 |
    (2 rows)
    

定义自定义的记录终止符

要定义不同于加载固定宽度数据时的 COPY 默认值的记录终止符,请执行以下步骤:

  1. 创建包含两列(coci)的表 fw

    => CREATE TABLE fw(co int, ci int);
    CREATE TABLE
    
  2. 复制该表 fw,并指定列大小为 2 个字节,指定逗号 (,) 作为记录终止符:

    => COPY fw FROM STDIN FIXEDWIDTH colsizes(2,2) RECORD TERMINATOR ',';
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 1234,1444,6666
    >> \.
    
  3. 查询表 fw 中的所有数据:

    => SELECT * FROM fw;
     co | ci
    ----+----
     12 | 34
     14 | 44
    (2 rows)
    

SELECT 输出仅指示两个值。 COPY 拒绝了第三个值 (6666),因为其后无逗号 (,) 记录终止符。仅在显式指定记录终止符时,固定宽度数据才需要尾随记录终止符。

复制固定宽度的数据

使用 COPY FIXEDWIDTH COLSIZES (n [,...) 将文件加载到 Vertica 数据库中。默认情况下,所有空格均为 NULL。例如:

=> CREATE TABLE mytest(co int, ci int);
=> CREATE PROJECTION mytest_p1 AS SELECT * FROM mytest SEGMENTED BY HASH(co) ALL NODES;
=> COPY mytest(co,ci) FROM STDIN FIXEDWIDTH colsizes(6,4) NO COMMIT;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> \.
=> SELECT * FROM mytest ORDER BY co;
 co | ci
----+----
(0 rows)

跳过固定宽度数据中的内容

COPY 语句有两个用于跳过输入数据的选项。SKIP BYTES 选项仅用于固定宽度数据加载:

以下示例将使用 SKIP BYTES 在加载包含两列(4 和 6 个字节)的固定宽度表时跳过 11 个字节:

  1. 使用 SKIP BYTES 复制表:

    => COPY fw FROM STDIN FIXEDWIDTH colsizes (4,6) SKIP BYTES 11;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 2222666666
    >> 1111999999
    >> 1632641282
    >> \.
    
  2. 查询表 fw 中的所有数据:

    => SELECT * FROM fw ORDER BY co;
      co  |   ci
    ------+--------
     1111 | 999999
     1632 | 641282
    (2 rows)
    

输出会确认 COPY 跳过了已加载数据的前 11 个字节。

以下示例会在加载固定宽度 (4、6) 表时使用 SKIP

  1. 复制表并使用 SKIP 跳过输入数据的两条记录:

    => COPY fw FROM STDIN FIXEDWIDTH colsizes (4,6) SKIP 2;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 2222666666
    >> 1111999999
    >> 1632641282
    >> 3333888888
    >> \.
    
  2. 查询表 fw 中的所有数据:

    => SELECT * FROM fw ORDER BY co;
      co  |   ci
    ------+--------
     1632 | 641282
     3333 | 888888
    (2 rows)
    

输出会确认 COPY 跳过了已加载数据的前两条记录。

在固定宽度的数据加载中修剪字符

使用 TRIM 选项可修剪字符。 TRIM 接受在数据开头和结尾处修剪的单字节字符。对于固定宽度数据加载,当您指定 TRIM 字符时,COPY 会先检查行是否为 NULL。如果行不为 NULL,COPY 会修剪字符。下一个示例指示 COPY 修剪字符 A,并显示结果:

  1. 复制表 fw 并指定 TRIM 字符 A

    => COPY fw FROM STDIN FIXEDWIDTH colsizes(4,6) TRIM 'A';
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> A22A444444
    >> A22AA4444A
    >> \.
    
  2. 查询表 fw 中的所有数据:

    => SELECT * FROM fw ORDER BY co;
     co |   ci
    ----+--------
     22 |   4444
     22 | 444444
    (2 rows)
    

在固定宽度的数据加载中使用填充

默认情况下,填充字符为“ ”(单个空格)。固定宽度数据加载的填充行为类似于如何以其他格式处理空格,处理方式因数据类型而异,具体如下: