使用 COPY 命令将数据加载到 Vertica 期间跳过列

问题描述 投票:0回答:1

我遇到的情况是我的文件的列数可以多于或少于表中的列数。在复制命令中,列名称是固定的,它代表表中的所有列我无法减少/增加列。

  1. 当我文件中的数据较少时:

文件数据:“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”

  1. 当我的文件中有更多数据时:

文件数据:“FC1”|“FC2”|“FC3”|“FC4”|“FC5”|“FC6”|“FC7”

复制 COPY_TEST(TC1,TC2,TC3,TC4) FROM LOCAL 'COPYTEST_More_COL' DELIMITER '|'由“”自动封闭;

给出错误“已拒绝(找到太多列)”

我需要任何替代解决方案来加载数据。

vertica fileloadexception
1个回答
0
投票

如果列发生很大变化,请考虑阅读 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 (空) (空)
© www.soinside.com 2019 - 2024. All rights reserved.