이 페이지에서는 AWS Glue를 사용하여 각 열의 데이터 값을 따옴표로 묶은 CSV 파일 또는 헤더 값이 포함된 CSV 파일에서 스키마를 만드는 방법을 설명합니다.
따옴표로 묶은 CSV 데이터 취급
다음 예시처럼 데이터 필드를 큰따옴표로 묶은 CSV 파일이 있다고 가정해 보겠습니다.
"John","Doe","123-555-1231","John said \"hello\""
"Jane","Doe","123-555-9876","Jane said \"hello\""
따옴표로 묶인 값을 가진 CSV 파일에서 생성된 테이블에 대해 Athena에서 쿼리를 실행하려면 OpenCSVSerDe를 사용하기 위해 AWS Glue에서 테이블 속성을 수정해야 합니다. OpenCSV SerDe에 대한 자세한 내용은 CSV 처리를 위한 Open CSV SerDe 단원을 참조하세요.
AWS Glue 콘솔에서 테이블 속성을 편집하려면
-
AWS Glue 콘솔 탐색 창에서 테이블을 선택합니다.
-
편집할 테이블 링크를 선택한 다음 작업(Actions), 테이블 편집(Edit table)을 선택합니다.
-
테이블 편집 페이지에서 다음과 같이 변경합니다.
-
직렬화 라이브러리(Serialization lib)에
org.apache.hadoop.hive.serde2.OpenCSVSerde
를 입력합니다. -
Serde 파라미터(Serde parameters)에서
escapeChar
,quoteChar
,separatorChar
키에 다음 값을 입력합니다.-
escapeChar
에 백슬래시(\
)를 입력합니다. -
quoteChar
에 큰따옴표("
)를 입력합니다. -
separatorChar
에 쉼표(,
)를 입력합니다.
-
-
-
Save(저장)를 선택합니다.
자세한 내용은 AWS Glue 개발자 안내서의 테이블 세부 정보 보기 및 편집을 참조하세요.
프로그래밍 방식으로 AWS Glue 테이블 속성을 업데이트할 수도 있습니다. 다음 JSON 예제처럼 AWS Glue UpdateTable API 작업 또는 update-table AWS CLI 명령을 사용해 테이블 정의의 SerDeInfo
블록을 수정합니다.
"SerDeInfo": {
"name": "",
"serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
"parameters": {
"separatorChar": ","
"quoteChar": "\""
"escapeChar": "\\"
}
},
헤더가 포함된 CSV 파일 취급
다음 예제와 같이 CREATE TABLE
문으로 Athena에서 테이블을 정의할 때 skip.header.line.count
테이블 속성을 사용하여 CSV 데이터의 헤더를 무시할 수 있습니다.
...
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/csvdata_folder
/';
TBLPROPERTIES ("skip.header.line.count"="1")
또는 헤더 정보가 Athena 쿼리 결과에 포함되지 않도록 미리 CSV 헤더를 제거할 수 있습니다. 한 가지 방법은 추출, 변환 및 로드(ETL) 작업을 수행하는 AWS Glue 작업을 사용하는 것입니다. AWS Glue에서 PySpark Python 언어의 확장 언어를 사용하여 스크립트를 작성할 수 있습니다. 자세한 내용은 AWS Glue 개발자 안내서의 AWS Glue에 작업 작성을 참조하세요.
다음 예는 from_options
를 사용하여 동적 프레임을 작성하고 writeHeader
형식 옵션을 false로 설정하여 헤더 정보를 제거하는 AWS Glue 스크립트의 함수를 보여줍니다.
glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://amzn-s3-demo-bucket/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")