将不良形成的数字加载到Vertica中



我正在尝试将一些数据加载到Vertica中。其中一列是浮点数在0.0至10.0的范围内,示例:

5.9、3.7、1.0、3.2等。

但不是:5.93,3.71214,1 ...

因此,它总是四舍五入到一个小数点位置,即使它为零,也不会省略。

问题是,小数分离器实际上可以是任何东西。主要是它的"。或",但我已经看到"/"甚至":"。经过无数次尝试,我决定完全摆脱它(想到"将数字乘以10")以获取:59、37、10、32等。

这是我在此特定列的复制命令中写的:

number_source FILLER VARCHAR(4),
number as (REGEXP_REPLACE(number_source, '[^0-9]', '', 1, 0, 'b'))::NUMERIC,

问题是,它行不通。加载数据几分钟后,Vertica吐出了以下内容:

vsql:load.sql:83: ERROR 3682:  Invalid input syntax for numeric: ""

如果我尝试使用:: integer而不是:: numeric,我会得到这个:

vsql:load.sql:83: ERROR 2827:  Could not convert "" to an int8

这可能是因为有一个不良值(根本不是数字),而Regexp_replace删除了所有内容,因此我留下了一个空的字符串,这会导致此问题。或者这是我不知道的其他事情。我不得不使用" b"修饰符,因为有没有非UTF8字符的乱码行,并且在这些行上也失败了。

我会失去这些破裂的行,但是在这种情况下,Vertica总是回滚,即使我没有指定"流产的错误",我也没有留下任何东西。有什么方法可以解决此问题,除了在加载到Vertica之前对数据集进行预处理?

我能够通过以下方式解决空字符串问题:

number as CASE WHEN REGEXP_REPLACE(number_source, '[^0-9]', '', 1, 0, 'b') = '' THEN 0 ELSE (REGEXP_REPLACE(number_source, '[^0-9]', '', 1, 0, 'b'))::INTEGER END,

基本上,我始终检查Regexp_replace是否返回一个空字符串,如果是的,则插入零,否则我将插入Regexp_replace的结果。这不是一个完美的解决方案,但可以正常工作。

最新更新