2016-07-05 1 views
0

PSQL 및 \ copy를 사용하여 Green-plum에서 파이프 분리 문자가있는 텍스트 파일 (클라이언트)로 데이터를 내보내려고합니다. 출력에서 단일 슬래시가 이중 슬래시로 변환되고 탭이 변환 된 것을 볼 수 있습니다. 예 N \ A는 N \\ A로 변환됩니다.PSQL을 사용하여 파일로 Greenplum

그래서 N \ A 대신 N \ A를 얻고 \ t 대신 공백을 가져 오는 방법은 무엇입니까?

참고 : \ copy 만 사용할 수 있습니다. 내 파일은 공간이 문제가 발생하기 때문에 SED 또는 Perl을 사용하여 찾기 및 바꾸기를 수행합니다.

+0

"\"는 이스케이프 문자이기 때문에 psql이 이스케이프 문자를 이스케이프 처리합니다. 원하지 않으면 다른 이스케이프 문자를 지정해야합니다. 구분 기호는 공백으로 변경할 수 있지만 여러 문자는 구분 기호로 지원되지 않습니다. 1Y이트. 자 분리. 자 여야합니다. –

+0

감사합니다 ... 당신이 다른 이스케이프 문자를 사용하는 방법을 말해 주면 좋을 것입니다 ...하지만 파이프는 구분 기호를 변경하지 마십시오 – Karthik

답변

0

"^"문자가 없다고 가정하면이 문자를 이스케이프 문자로 사용할 수 있습니다. 사본에

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을 사용할 수 있지만 말했듯이 쓰기 가능한 외부 테이블을 사용하는 것보다 느립니다.

+0

슈퍼 ... 도움을 주셔서 감사합니다 ... 당신의 답변은 저에게 새로운 것을주었습니다. 배우기 – Karthik