2011-01-04 5 views
2

CSV 파일에 수십억 개의 데이터 행이 있습니다. 각 행은 10 ~ 20 개의 열을 가질 수 있습니다. COPY FROM을 사용하여 데이터를 20 개의 열을 포함하는 테이블로로드하려고합니다. 특정 CSV 행에 10 개의 데이터 열만 있으면 COPY FROM이 나머지 열 (값이 누락 된 열)을 NULL로 설정합니다. CREATE TABLE 문의 모든 컬럼에 DEFAULT NULL을 지정합니다.Postgresql : occasion missing columns가있는 csv 파일에서 복사

내 질문 : COPY FROM?

EDIT : Greenplum (PostgreSQL을 기반으로하는 데이터베이스)에는 FILL MISSING FIELDS라는 스위치가 있습니다.이 스위치는 제가 설명하는 것을 수행합니다 (해당 설명서 here 참조). PostgreSQL에 어떤 해결 방법을 권하고 싶습니까? PostgreSQL manual에서

답변

2

와 비슷한 일을 수행

그 후, 당신은 라인을 분할 SQL을 사용할 수 있으며,이 같은 것을 열을 추출 열이 충분하지 않은 행에 쉼표를 추가하거나 CSV를 TSV (탭으로 구분)로 변환하고 추가 열에 "\ N"을 넣으면됩니다.

0

: 입력 파일의 라인이 예상보다 더 많거나 더 적은 열이 포함 된 경우 오류가 발생합니다 FROM

COPY.

COPY 문에 이름을 지정해야하는 열의 수를 확인하려면 CSV 파일의 첫 번째 행을 읽으십시오.

+0

어떤 해결 방법을 권하고 싶습니다? – David

+1

파일을 사전 처리하는 스크립트를 작성하십시오. 예를 들어, 일부에서 분리 문자의 수를 확인하여 누락 된 파일을 추가하십시오.scritps 작성을 좋아하는 경우 –

1

나는 COPY FROM을 동일한 파일 내의 다른 수의 열로 처리 할 수 ​​있다고 생각하지 않는다.

항상 같은 10 개의 누락 된 열이있는 경우 먼저 모든 것을 text 열이있는 준비 테이블에로드하는 것이 좋습니다. 에 사전 처리 스크립트를 작성

 
INSERT INTO target_table (col1, col2, col3, col4, col5, ...) 
SELECT columns[1], columns[2], ... 
FROM ( 
    SELECT string_to_array(big_column, ',') as columns 
    FROM staging_table 
) t 
WHERE array_length(columns) = 10 

을 다음 array_length(columns) = 20

+0

이렇게하는 방법처럼 보이지만 모든 데이터를 두 개의 테이블에 삽입해야하므로 성능이 걱정됩니다. – David

+0

CSV 파일의 생성 과정을 변경할 수 없다면 다른 방법이 보이지 않습니다 –

1

문맥에서 etldata-warehouse - 내 제안은 실제로 당신이 찾고있는 "바로 가기"를 피하는 것입니다.

ETL은 ECCD (추출, 정리, 준수, 전달)로 자주 구현되는 프로세스입니다. 이러한 파일을 "Extracted (추출됨)"로 처리 할 수 ​​있으므로 데이터 정리 및 다른 단계로의 준수를 구현하기 만하면됩니다. 추가 디스크 공간이 필요합니다. 모든 일치 된 파일은 "최종"(모든 열) 구조를 가져야합니다. 그런 다음 해당 파일을 제공하십시오 (COPY FROM).

이렇게하면 ETL 프로세스와 각 단계에서 누락 된 필드에 어떤 일이 발생하는지 문서화 할 수 있습니다.

원래의 고객 파일과 준수 버전을 감사 및 디버그 목적으로 보관하는 것이 일반적입니다 (디스크, DVD).

+0

고마워요. 나는 실제로 그 한 걸음 더 가야한다고 느끼고 있었지만 이것을 읽은 후에는 어쨌든 갈 수있는 적절한 방법으로 보인다 :) – Smalcat

관련 문제