"^"문자가 없다고 가정하면이 문자를 이스케이프 문자로 사용할 수 있습니다. 사본에
copy tpcds.call_center to stdout with delimiter '|' escape '^';
더는 여기에서 찾을 수 있습니다 : https://www.postgresql.org/docs/8.2/static/sql-copy.html
이 기술은 상대적으로 느린하고 마스터에 부담을합니다. 대신 gpfdist를 사용하면 클러스터에서 병렬 처리를 활용하고 마스터를 우회 할 수 있습니다. 이 솔루션은 많은 양의 데이터를 언로드하는 데 이상적입니다.
첫째, gpfidst 프로세스를 시작 :
[[email protected] ~]$ gpfdist -p 8888 > gpfdist_8888.log 2>&1 < gpfdist_8888.log &
[1] 2255
이제, 당신은 외부 테이블을 만들 수 있습니다.
gpadmin=# insert into tpcds.et_call_center select * from tpcds.call_center;
INSERT 0 6
Time: 72.653 ms
gpadmin=# \q
가 확인 :
[[email protected] ~]$ psql
SET
Timing is on.
psql (8.2.15)
Type "help" for help.
gpadmin=# create writable external table tpcds.et_call_center
(like tpcds.call_center)
location ('gpfdist://gpdbsne:8888/call_center.txt')
format 'text' (delimiter '|' escape '^');
NOTICE: Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table
CREATE EXTERNAL TABLE
Time: 18.681 ms
지금, 당신은 데이터를 삽입 내 예제에서는이 클러스터의 모든 세그먼트에 액세스 할 수있는 호스트 이름 "gpdbsne"를 사용
[[email protected] ~]$ wc -l call_center.txt
6 call_center.txt
. 일반적으로 Greenplum은 세그먼트 간의 통신을 위해 개인 네트워크를 사용하므로이 호스트 이름을 개인 네트워크에 연결해야합니다.
쓰기 가능한 외부 테이블은 SQL로 작성되므로 SQL에서 원하는 변환 논리를 사용할 수 있으므로 원하는 경우 탭을 공백으로 변경할 수 있습니다. 이렇게하면 파일을 사후 처리하기 위해 awk 또는 sed가 필요하지 않습니다. 복사도 SQL을 사용할 수 있지만 말했듯이 쓰기 가능한 외부 테이블을 사용하는 것보다 느립니다.
"\"는 이스케이프 문자이기 때문에 psql이 이스케이프 문자를 이스케이프 처리합니다. 원하지 않으면 다른 이스케이프 문자를 지정해야합니다. 구분 기호는 공백으로 변경할 수 있지만 여러 문자는 구분 기호로 지원되지 않습니다. 1Y이트. 자 분리. 자 여야합니다. –
감사합니다 ... 당신이 다른 이스케이프 문자를 사용하는 방법을 말해 주면 좋을 것입니다 ...하지만 파이프는 구분 기호를 변경하지 마십시오 – Karthik