我遇到的情况是我的文件的列数可以多于或少于表中的列数。在复制命令中,列名称是固定的,它代表表中的所有列我无法减少/增加列。
文件数据:“FC1”|“FC2”
从本地“COPYTEST_LESS_COL”DELIMITER“|”复制COPY_TEST(TC1,TC2,TC3,TC4)由“”自动封闭;
给出错误“已拒绝(找到的列太少)”
注意:>我尝试保留表中列的默认值,但仍然出现相同的错误 > FILLER 不支持 :
从本地“COPYTEST_LESS_COL”DELIMITER“|”复制COPY_TEST(TC1,TC2,TC3 FILLER VARCHAR(255),TC4 FILLER VARCHAR(255))由 '"' AUTO 封闭; 错误 2671:列引用“TC3”不明确 详细信息:参考“TC3”可以指“COPY_TEST.TC3”或“FILLER.TC3”
文件数据:“FC1”|“FC2”|“FC3”|“FC4”|“FC5”|“FC6”|“FC7”
复制 COPY_TEST(TC1,TC2,TC3,TC4) FROM LOCAL 'COPYTEST_More_COL' DELIMITER '|'由“”自动封闭;
给出错误“已拒绝(找到太多列)”
我需要任何替代解决方案来加载数据。
如果列发生很大变化,请考虑阅读 Vertica 文档的这一部分 - 关于弹性表:
https://docs.vertica.com/23.4.x/en/flex-tables/
但是,如果开头的列是稳定的,并且仅在最后,您可能偶尔会向原本稳定的文件结构添加一个、两个或三个字段,请尝试这种情况 - 我在 sql 中内嵌添加了数据使用vsql执行的文件:
-- start of script
DROP TABLE IF EXISTS copy_test;
CREATE TABLE copy_test(
scen VARCHAR(32)
, tc1 VARCHAR(8)
, tc2 VARCHAR(8)
, tc3 VARCHAR(8)
, tc4 VARCHAR(8)
);
COPY COPY_TEST(
scen
, TC1
, TC2
, tc3
, tc4
, tc5 FILLER CHAR(3)
, tc6 FILLER CHAR(3)
, tc7 FILLER CHAR(3)
) FROM LOCAL STDIN DELIMITER '|' ENCLOSED BY '"'
SKIP 1
TRAILING NULLCOLS
EXCEPTIONS '/dev/tty';
scen| tc1 | tc2 | tc3 | tc4
trailing nullcols|"FC1"|"FC2"
trailing nullcols|"FC1"|"FC2"|"FC3"
all columns filled|"FC1"|"FC2"|"FC3"|"FC4"
too many fields|"FC1"|"FC2"|"FC3"|"FC4"|"FC5"|"FC6"|"FC7"
too many fields|"FC1"|"FC2"|"FC3"|"FC4"|"FC5"|"FC6"
too many fields|"FC1"|"FC2"|"FC3"|"FC4"|"FC5"
\.
\pset null (null)
SELECT * FROM copy_test;
-- end of script
你得到的是这样的:
场景 | tc1 | tc2 | tc3 | tc4 |
---|---|---|---|---|
所有列均已填满 | FC1 | FC2 | FC3 | FC4 |
字段太多 | FC1 | FC2 | FC3 | FC4 |
字段太多 | FC1 | FC2 | FC3 | FC4 |
字段太多 | FC1 | FC2 | FC3 | FC4 |
尾随空值 | FC1 | FC2 | FC3 | (空) |
尾随空值 | FC1 | FC2 | (空) | (空) |