2016-08-17 43 views
0

在Vertica 7.2中,我使用的是帶fdelimitedparser的COPY。我希望能夠爲某些但不是全部列指定日期或日期時間格式。不同的日期列可以有不同的格式。HP Vertica - 如何指定CSV分析器的日期格式

我不能列出所有的列,比如在沒有解析器的情況下使用COPY,因爲我有很多不同列組合的文件,我寧願避免編寫一個腳本來爲每個文件生成我的複製命令。

有沒有辦法做到這一點?

此外,我怎麼知道哪個解析器本地接受哪種日期格式?

謝謝!

回答

0

加載數據時,可以使用Vertica填充選項。

在這裏看到的例子:

Transform data during load in Vertica

一個小例子也:

dbadmin=> \! cat /tmp/file.csv 
2016-19-11 

dbadmin=> copy tbl1 (v_col_1 FILLER date FORMAT 'YYYY-DD-MM',col1 as v_col_1) from '/tmp/file.csv'; 
Rows Loaded 
------------- 
      1 
(1 row) 

dbadmin=> select * from tbl1; 
    col1 
------------ 
2016-11-19 
(1 row) 

dbadmin=> copy tbl1 (v_col_1 FILLER date FORMAT 'YYYY-MM-DD',col1 as v_col_1) from '/tmp/file.csv'; 
Rows Loaded 
------------- 
      1 
(1 row) 

dbadmin=> select * from tbl1; 
    col1 
------------ 
2016-11-19 
2017-07-14 
(2 rows) 

希望這有助於

+1

你並不需要的填充物。您可以直接在列上指定格式。另請注意,他正在使用flex解析器。 – woot

0

您可以使用格式關鍵字作爲部分COPY命令

見下文例如,從Vertica的論壇:

create table test3 (id int, Name varchar(16), dt date, f2 int); 
CREATE TABLE 

vsql=> \!cat /tmp/mydata.data 
1|foo|29-Jan-2013|100.0 
2|bar|30-Jan-2013|200.0 
3|egg|31-Jan-2013|300.0 
4|tux|01-Feb-2013|59.9 

vsql=> copy test3 
vsql-> (id, Name, dt format 'DD#MON#YYYY', f 2) 
vsql-> from '/tmp/mydata.data' direct delimiter '|' abort on error; 
Rows Loaded 
------------- 
      4 
(1 row) 

vsql=> select * from test3; 
id | Name |  dt  | f2 
----+------+------------+---------- 
    1 | foo | 2013-01-29 | 100.0000 
    2 | bar | 2013-01-30 | 200.0000 
    3 | egg | 2013-01-31 | 300.0000 
    4 | tux | 2013-02-01 | 59.9000 
+0

謝謝,但我認爲這需要我在括號中輸入正確的列名稱集,而我試圖解釋的是我使用flex解析器,因爲列組合在我的不同文件之間往往會有很大差異。 – bezout

0

我明白了,你需要之間選擇「簡單加載「和‘快 消費’,彎曲表將增加對消費者的一些影響, 關於這方面的一些信息:Flex表是基於行的存儲,它將消耗更多的磁盤空間,並且它具有零能力來編碼數據, 您有能力將相關列實現爲 列,但數據將會持續兩次,在ROW和 柱狀圖上憤怒(加載時間應該更慢,並且需要) 。在查詢時,如果你打算只查詢物化 列,你應該沒問題,但如果沒有,你應該期望有 性能問題

+0

其實我的表不是Flex。我宣佈該表考慮了可能列的詳盡性。但是我的數據源都只實現了一些列。我調用解析器flex是因爲我希望它讀取頭文件,而不是在加載時顯式定義列名和順序,但所有列和數據類型都已在創建表時聲明。 – bezout