CSV 데이터셋의 파싱 설정
CSV는 구분자, 인용 문자와 이스케이프 방식이 파일마다 다를 수 있습니다. Foundry는 데이터셋 스키마에 파싱 설정을 저장하고 입력에 맞는 값을 추론합니다. 추론 결과가 실제 파일 형식과 맞는지 확인하고 필요한 설정을 수정합니다. 다음 설정은 CSV 파일로 만든 데이터셋에 적용합니다.
설정 위치와 reader 선택
Dataset Preview의 Details > Schema에서 스키마를 보고 Edit으로 편집합니다. Preview의 Edit Schema는 파싱 옵션에 따라 결과가 어떻게 달라지는지 확인하는 UI입니다. 심하게 불규칙한 CSV는 스키마를 직접 편집해야 할 수 있습니다.
일반적인 CSV 데이터셋은 dataFrameReaderClass에 TextDataFrameReader를 사용합니다. 실행 시에는 Spark CSV DataFrameReader에 처리를 위임합니다. Spark 옵션을 직접 사용하는 별도 경로에는 DataSourceDataFrameReader를 지정합니다.
TextDataFrameReader
기존 열 정의 fieldSchemaList와 다른 필요한 스키마 항목은 유지하고 다음 reader 및 customMetadata.textParserParams 설정을 구성합니다. 아래는 UTF-8 CSV에서 첫 줄을 건너뛰는 예시입니다. skipLines의 일반 기본값은 0이며 여기서는 1을 지정했습니다. nullValues는 null로 읽을 문자열 목록이며 예제에서는 추가 표식을 지정하지 않았습니다.
{
"dataFrameReaderClass": "com.palantir.foundry.spark.input.TextDataFrameReader",
"customMetadata": {
"textParserParams": {
"parser": "CSV_PARSER",
"nullValues": [],
"charsetName": "UTF-8",
"fieldDelimiter": ",",
"recordDelimiter": "\n",
"quoteCharacter": "\"",
"dateFormat": {},
"skipLines": 1,
"jaggedRowBehavior": "THROW_EXCEPTION",
"parseErrorBehavior": "THROW_EXCEPTION",
"addFilePath": false,
"addFilePathInsteadOfUri": false,
"addImportedAt": false,
"initialReadTimeout": "1 hour"
}
}
}
| 속성 | 의미 | 값과 기본값 | 적용 파서 |
|---|---|---|---|
parser | 사용할 파서 | 필수. CSV_PARSER, MULTILINE_CSV_PARSER, SIMPLE_PARSER, SINGLE_COLUMN_PARSER | 파서 선택 자체 |
nullValues | null로 해석할 문자열 | 필수 문자열 목록 | 전체 |
fieldDelimiter | 행을 필드로 나누는 구분자 | 한 문자 문자열. 기본 쉼표 | CSV, MULTILINE CSV, SIMPLE |
recordDelimiter | 파일을 레코드로 나누는 줄 끝 | 줄바꿈 문자로 끝나는 문자열. 기본 \n | CSV, MULTILINE CSV |
quoteCharacter | CSV 인용 문자 | 한 문자 문자열. 기본 큰따옴표 | CSV, MULTILINE CSV |
dateFormat | 열별 날짜 해석 형식 | 열 이름에서 JodaTime DateTimeFormat 패턴으로의 맵. 기본 빈 맵 | CSV, MULTILINE CSV, SIMPLE |
skipLines | 파일마다 처음에 건너뛸 줄 수 | 음이 아닌 수. 기본 0 | 전체 |
jaggedRowBehavior | 스키마보다 필드가 많거나 적은 행 처리 | THROW_EXCEPTION 또는 DROP_ROW. 기본 THROW_EXCEPTION | 별도 파서 구분 없음 |
parseErrorBehavior | 지정 자료형으로 값을 해석하지 못할 때 처리 | THROW_EXCEPTION 또는 REPLACE_WITH_NULL. 기본 THROW_EXCEPTION | 별도 파서 구분 없음 |
addFilePath | 각 행에 파일 경로 추가 | Boolean. 기본 false | 전체 |
addImportedAt | 각 행에 가져온 시각 추가 | Boolean. 기본 false | 전체 |
initialReadTimeout | 첫 행을 읽기 시작할 때까지의 대기 제한 | 사람이 읽는 duration. 기본 1 hour | 전체 |
표의 CSV, MULTILINE CSV와 SIMPLE은 각각 CSV_PARSER, MULTILINE_CSV_PARSER, SIMPLE_PARSER를 줄여 쓴 것입니다. 첫 행 대기 제한을 전체 파일 파싱 시간 한도로 해석하면 안 됩니다.
행을 버리는 DROP_ROW와 값만 null로 바꾸는 REPLACE_WITH_NULL은 손실 범위가 다릅니다. 불규칙한 행을 유지하며 공통 스키마를 적용하는 조건은 CSV 문제 해결에서 설명합니다.
Spark CSV 옵션을 직접 사용
Spark CSV DataFrameReader 옵션을 사용하려면 reader를 바꾸고 customMetadata.format을 csv로 설정합니다. 옵션은 customMetadata.options의 키와 값으로 넣습니다.
{
"dataFrameReaderClass": "com.palantir.foundry.spark.input.DataSourceDataFrameReader",
"customMetadata": {
"format": "csv",
"options": {
"unescapedQuoteHandling": "STOP_AT_DELIMITER",
"multiLine": true
}
}
}
multiLine은 인용된 값 안의 줄바꿈을 같은 레코드의 일부로 읽습니다. unescapedQuoteHandling: STOP_AT_DELIMITER는 이스케이프하지 않은 인용 문자가 있으면 값을 인용되지 않은 값으로 처리하고 구분자나 줄 끝까지 읽는 설정입니다. 파일의 실제 인용 및 이스케이프 방식에 맞게 선택해야 합니다.
TextDataFrameReader의 fieldDelimiter와 Spark의 sep/delimiter처럼 비슷한 의미라도 설정 이름과 허용값이 같지는 않습니다. 두 reader의 옵션을 한 경로에 섞지 않습니다.