2.2 導(dǎo)入
2.2.1 使用gpfdist導(dǎo)入
2.2.1.1 啟動gpfdist服務(wù)
使用service就要分配端口,在我們的實際項目中一般把gpfdist服務(wù)的端口設(shè)置到9000以上,防止與其他服務(wù)沖突。
示例:
gpfdist -d /backup/etl_data -p 9091 -l /home/etl/gpfdist_9091.log&
回車再回車即可。
使用&將9091這個這個端口上的gpfdist服務(wù)放到后臺。
這樣,在/backup/etl_data這個路徑下的接口文件都可以通過gpfdist服務(wù)的各種功能來操作。一些簡單的日志會記錄在/home/etl/gpfdist_9091.log這個文件里,目前版本只是找不到文件才會往里面寫日志—這個功能真可憐。
例如:
gfile stat /backup/jzqd/BIUP_GD1/CB51020M* failure: No such file or directory
fstream unable to open file /backup/jzqd/BIUP_GD1/CB51020M*
[2012-07-01 19:40:45] [WRN gpfdist.c:1030] reject request from 192.168.1.3, path /backup/jzqd/BIUP_GD1/CB51020M*
2.2.1.2 查看gpfdist服務(wù)
etl@smdw:~> ps -ef|grep gpfdist
etl 8404 7503 0 11:17 pts/3 00:00:00 grep gpfdist
etl 22913 1 1 Jul07 pts/3 01:12:26 gpfdist -d /backup/etl_data -p 9091 -l /home/etl/gpfdist_9091.log
etltest 26466 1 0 Jul08 pts/3 00:00:44 gpfdist -d /backup/etl_data -p 9092 -l /home/etltest/gpfdist_9092.log
etl@smdw:~>
在使用gpfdist服務(wù)之前最好用ps命令查看一下服務(wù)啟動用戶、啟動時間、指向路徑以及日志記錄日志。
在本例中可以看到9091上的gpfdist是由etl用戶啟動的,9092上的是由etltest用戶啟動的。因為不同的用戶對不同目錄的訪問權(quán)限不一樣,所以這兩個gpfdist如果要訪問同一路徑下的某一個文件則需要預(yù)先給目錄和文件賦予用戶可以訪問的權(quán)限。即gpfdist讀寫文件的權(quán)限跟它的啟動用戶的讀寫權(quán)限是直接關(guān)聯(lián)的。
2.2.1.3 Gpfdist下的外部表
要通過gpfdist把文本文件裝載導(dǎo)入到實體表,首先就要為實體表建立對應(yīng)的可讀外部表,在外部表的定義中的locatoin來指定對應(yīng)的文本文件的路徑,然后通過讀取外部表來把文本文件的內(nèi)容讀取到數(shù)據(jù)庫里面。
例如我們要把文本文件DATAFILE20120718.txt導(dǎo)入到實體表stage.tf_f_user中:
建立實體表:
create table stage.tf_f_user (字段1,字段2,字段3……) 分布鍵 分區(qū)……
為實體表建立對應(yīng)的外部表:
create readable external table stage.tf_f_user_external (字段1,字段2,字段3……)
LOCATION ('gpfdist://smdw-1:9091/DATAFILE20120718.txt') ……
(創(chuàng)建外部表的時候默認(rèn)為可讀外部表,所readable不寫也是可以的)
這個句子指定了外部表stage.tf_f_user_external的對應(yīng)文本文件是目錄/backup/etl_data下的文件DATAFILE20120718.txt。
(注意:外部表的字段順序必須與文本文件中的字段順序是一致的,并且要保證外部表中的字段長度不能小于文本文件中對應(yīng)字段的長度)
這樣,我們寫一個語句:
insert into stage.tf_f_user(字段1,字段2,字段3,……) select 字段1,字段2,字段3…… from stage.tf_f_user_external;
然后執(zhí)行之,就可以把文本文件DATAFILE20120718.txt中的內(nèi)容讀取到之前建立的實體表stage.tf_f_user里面去了。到這就完成了文本文件到實體表的導(dǎo)入。
2.2.2 使用copy導(dǎo)入
使用copy命令把文本文件導(dǎo)入到表正如前面所說是比較簡潔的,它不需要額外的建立外部表,在文本文件的字段順序與表的字段順序一致的情況下,只需要執(zhí)行簡單的copy命令就可以完成導(dǎo)入動作,例如:
etl@smdw:/backup/etl_data/ > psql -d bi -h mdw -U bidw
psql (8.2.15)
Type "help" for help.
bi=> \copy stage.tf_f_user from ‘/backup/etl_data/DATAFILE_20120718_0001.txt’ with delimiter ‘|’;
然后回車就可以把DATAFILE_20120718_0001.txt這個以“|”為字段分隔符的文本文件導(dǎo)入到stage.tf_f_user表中了。