2014-03-06 42 views
2

我試圖將一些數據加載到Vertica中。其中一列的是在0.0的範圍內的浮點數至10.0,實施例:將嚴重格式的數字加載到Vertica中

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而不是::數字的,我得到這個:

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

這可能是因爲有一個錯誤的值(根本不是數字),並且REGEXP_REPLACE刪除了所有內容,所以我留下了一個空字符串導致這個問題。或者這是我不知道的其他事情。我必須使用'b'修飾符,因爲存在非UTF8字符的亂碼行,並且在這些行上也會失敗。

我完全可以丟失這些損壞的行,但Vertica總是在這種情況下回滾,即使我沒有指定「ABORT ON ERROR」,也沒有任何結果。除了在加載到Vertica之前預處理數據集,有什麼方法可以解決這個問題嗎?

+0

你可以加載到臨時登臺表,執行清理,然後加載到你的數據表? – Kermit

+0

我可以做任何我想做的事,但我不確定我會如何完成你的建議。 – PeterK

+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。不是一個完美的解決方案,但它工作。

+1

很酷。好的解決方案 – Kermit