固定宽度格式数据
使用 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,请使用NULL AS
选项并指定 NULL AS ''
。
定义 null 字符(语句级别)
-
创建包含两个列的表 (
fw
):=> CREATE TABLE fw(co int, ci int); CREATE TABLE
-
复制该表并将 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 >> \.
-
从表中选择所有 (
*
):=> SELECT * FROM fw; co | ci ----+---- | 12 23 | (2 rows)
定义自定义的记录终止符
要定义不同于加载固定宽度数据时的 COPY
默认值的记录终止符,请执行以下步骤:
-
创建包含两列(
co
和ci
)的表fw
:=> CREATE TABLE fw(co int, ci int); CREATE TABLE
-
复制该表
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 >> \.
-
查询表
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 个字节:
-
使用
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 >> \.
-
查询表
fw
中的所有数据:=> SELECT * FROM fw ORDER BY co; co | ci ------+-------- 1111 | 999999 1632 | 641282 (2 rows)
输出会确认 COPY
跳过了已加载数据的前 11 个字节。
以下示例会在加载固定宽度 (4、6) 表时使用 SKIP
:
-
复制表并使用
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 >> \.
-
查询表
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,并显示结果:
-
复制表
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 >> \.
-
查询表
fw
中的所有数据:=> SELECT * FROM fw ORDER BY co; co | ci ----+-------- 22 | 4444 22 | 444444 (2 rows)
在固定宽度的数据加载中使用填充
默认情况下,填充字符为“ ”(单个空格)。固定宽度数据加载的填充行为类似于如何以其他格式处理空格,处理方式因数据类型而异,具体如下: