将格式错误的数字加载到Vertica中

时间:2014-03-06 14:22:44

标签: import floating-point vertica

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

5.9,3.7,1.0,3.2等。

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

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

问题是,小数分隔符实际上可以是任意的。主要是它的“。”或“,”但我看到“/”甚至“:”。经过多次尝试后,我决定完全摆脱它(想想“将数字乘以10”)以获得:59,37,10,32等。

这是我在这个特定专栏的COPY命令中写的:

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总是在这种情况下回滚,即使我没有指定“ABORT ON ERROR”,我也没有任何结果。有没有办法解决这个问题,除了在加载到Vertica之前预处理数据集?

1 个答案:

答案 0 :(得分:3)

我能够使用以下方法解决空字符串问题:

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的结果。不是一个完美的解决方案,但它确实有效。