在Vertica 7.2中,我使用的是帶fdelimitedparser的COPY。我希望能夠爲某些但不是全部列指定日期或日期時間格式。不同的日期列可以有不同的格式。HP Vertica - 如何指定CSV分析器的日期格式
我不能列出所有的列,比如在沒有解析器的情況下使用COPY,因爲我有很多不同列組合的文件,我寧願避免編寫一個腳本來爲每個文件生成我的複製命令。
有沒有辦法做到這一點?
此外,我怎麼知道哪個解析器本地接受哪種日期格式?
謝謝!
在Vertica 7.2中,我使用的是帶fdelimitedparser的COPY。我希望能夠爲某些但不是全部列指定日期或日期時間格式。不同的日期列可以有不同的格式。HP Vertica - 如何指定CSV分析器的日期格式
我不能列出所有的列,比如在沒有解析器的情況下使用COPY,因爲我有很多不同列組合的文件,我寧願避免編寫一個腳本來爲每個文件生成我的複製命令。
有沒有辦法做到這一點?
此外,我怎麼知道哪個解析器本地接受哪種日期格式?
謝謝!
加載數據時,可以使用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)
希望這有助於
您可以使用格式關鍵字作爲部分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
謝謝,但我認爲這需要我在括號中輸入正確的列名稱集,而我試圖解釋的是我使用flex解析器,因爲列組合在我的不同文件之間往往會有很大差異。 – bezout
我明白了,你需要之間選擇「簡單加載「和‘快 消費’,彎曲表將增加對消費者的一些影響, 關於這方面的一些信息:Flex表是基於行的存儲,它將消耗更多的磁盤空間,並且它具有零能力來編碼數據, 您有能力將相關列實現爲 列,但數據將會持續兩次,在ROW和 柱狀圖上憤怒(加載時間應該更慢,並且需要) 。在查詢時,如果你打算只查詢物化 列,你應該沒問題,但如果沒有,你應該期望有 性能問題
其實我的表不是Flex。我宣佈該表考慮了可能列的詳盡性。但是我的數據源都只實現了一些列。我調用解析器flex是因爲我希望它讀取頭文件,而不是在加載時顯式定義列名和順序,但所有列和數據類型都已在創建表時聲明。 – bezout
你並不需要的填充物。您可以直接在列上指定格式。另請注意,他正在使用flex解析器。 – woot