JSON 형식의 COPY 지원 - Amazon Redshift

JSON 형식의 COPY 지원

JSON 데이터 구조는 객체 또는 배열 집합으로 구성됩니다. JSON 객체는 중괄호로 시작해서 끝나며 이름-값 페어 집합이 순서에 상관없이 포함되어 있습니다. 각 이름과 값은 각각 콜론으로 구분되며, 페어는 서로 쉼표로 구분됩니다. 이름은 큰 따옴표로 묶이는 문자열입니다. 인용 부호는 기울어진 따옴표나 "스마트" 따옴표가 아닌 단순한 따옴표(0x22)여야 합니다.

JSON 배열은 대괄호로 시작해서 끝나며 쉼표로 구분된 값 집합이 순서에 따라 포함되어 있습니다. 값은 큰 따옴표로 묶이는 문자열, 숫자, 부울(true 또는 false), NULL, JSON 객체 또는 배열이 될 수 있습니다.

JSON 객체와 배열은 중첩이 가능하여 계층적인 데이터 구조를 이룹니다. 다음은 유효한 객체 2개가 포함된 JSON 데이터 구조의 예입니다.

{ "id": 1006410, "title": "Amazon Redshift Database Developer Guide" } { "id": 100540, "name": "Amazon Simple Storage Service User Guide" }

다음은 두 개의 JSON 배열과 동일한 데이터를 보여 줍니다.

[ 1006410, "Amazon Redshift Database Developer Guide" ] [ 100540, "Amazon Simple Storage Service User Guide" ]

JSON에 대한 COPY 옵션

JSON 형식 데이터와 함께 COPY를 사용할 경우 다음 옵션을 지정할 수 있습니다.

  • 'auto' - COPY가 JSON 파일에서 필드를 자동으로 로드합니다.

  • 'auto ignorecase' - COPY가 필드 이름의 대/소문자를 무시하면서 JSON 파일에서 필드를 자동으로 로드합니다.

  • s3://jsonpaths_file - COPY가 JSONPaths 파일을 사용하여 JSON 원본 데이터를 구문 분석합니다. JSONPaths 파일은 이름 "jsonpaths"가 JSONPath 표현식 배열과 쌍을 이루는 단일 JSON 객체가 포함된 텍스트 파일입니다. 이때 이름이 "jsonpaths"가 아닌 다른 문자열이면 COPY는 JSONPaths 파일 대신 'auto' 인수를 사용합니다.

'auto', 'auto ignorecase' 또는 JSONPaths 파일을 사용하여 데이터를 로드하는 방식과 JSON 객체 또는 배열을 사용하여 데이터를 로드하는 방법을 나타낸 예는 JSON에서 복사 예제 섹션을 참조하세요.

JSONPath 옵션

Amazon Redshift COPY 구문에서 JSONPath 표현식은 대괄호 또는 점 표기법을 사용하여 JSON 계층적 데이터 구조의 단일 이름 요소에 대한 명시적 경로를 지정합니다. Amazon Redshift는 모호한 경로 또는 여러 이름 요소로 해석될 수 있는 와일드카드 문자 또는 필터 표현식과 같은 JSONPath 요소를 지원하지 않습니다. 결과적으로 Amazon Redshift는 복잡한 다단 데이터 구조의 구문을 분석할 수 없습니다.

다음은 대괄호 표기법을 사용하여 JSONPath 표현식을 작성한 JSONPaths 파일의 예입니다. 달러 기호($)는 루트 레벨 구조를 나타냅니다.

{ "jsonpaths": [ "$['id']", "$['store']['book']['title']", "$['location'][0]" ] }

위 예에서 $['location'][0]은 배열에서 첫 번째 요소를 참조합니다. JSON은 0부터 시작되는 배열 인덱싱을 사용합니다. 배열 인덱스는 0보다 크거나 같은 양의 정수가 되어야 합니다.

다음은 위의 JSONPaths 파일에 점 표기법을 사용한 예입니다.

{ "jsonpaths": [ "$.id", "$.store.book.title", "$.location[0]" ] }

jsonpaths 배열에서 대괄호 표기법과 점 표기법을 혼용할 수는 없습니다. 다만 배열 요소를 참조할 때는 대괄호 표기법과 점 표기법 모두에서 대괄호를 사용할 수 있습니다.

점 표기법을 사용할 경우에는 JSONPath 표현식에 다음 문자가 포함되어서는 안 됩니다.

  • 작은 직선형 따옴표(')

  • 마침표 또는 점(.)

  • 배열 요소를 참조하기 위한 경우를 제외한 대괄호([ ])

JSONPath 표현식이 참조하는 이름-값 페어의 값이 객체 또는 배열이면 중괄호나 대괄호를 포함하여 전체 객체 또는 배열이 문자열로 로드됩니다. 예를 들어 JSON 데이터에 다음과 같은 객체가 포함되어 있다고 가정하겠습니다.

{ "id": 0, "guid": "84512477-fa49-456b-b407-581d0d851c3c", "isActive": true, "tags": [ "nisi", "culpa", "ad", "amet", "voluptate", "reprehenderit", "veniam" ], "friends": [ { "id": 0, "name": "Martha Rivera" }, { "id": 1, "name": "Renaldo" } ] }

그러면 JSONPath 표현식 $['tags']가 다음 값을 반환합니다.

"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]"

그러면 JSONPath 표현식 $['friends'][1]가 다음 값을 반환합니다.

"{"id": 1,"name": "Renaldo"}"

jsonpaths 배열의 JSONPath 표현식은 각각 Amazon Redshift 대상 테이블의 열 1개에 해당합니다. 따라서 jsonpaths 배열 요소의 순서는 대상 테이블의 열 순서와, 혹은 열 목록을 사용하는 경우 열 목록의 열 순서와 일치해야 합니다.

'auto' 인수 또는 JSONPaths 파일을 사용하여 데이터를 로드하는 방법과 JSON 객체 또는 배열을 사용하여 데이터를 로드하는 방법을 보여주는 예는 JSON에서 복사 예제 섹션을 참조하세요.

여러 JSON 파일을 복사하는 방법에 대한 자세한 내용은 매니페스트를 사용하여 데이터 파일 지정 섹션을 참조하세요.

JSON의 이스케이프 문자

COPY는 줄 바꿈 문자로 \n을, 그리고 탭 문자로 \t를 로드합니다. 백슬래시를 로드하려면 백슬래시(\\)로 이스케이프하십시오.

예를 들어 escape.json 버킷에 저장된 s3://amzn-s3-demo-bucket/json/이라는 이름의 파일에 다음과 같은 JSON이 있다고 가정하겠습니다.

{ "backslash": "This is a backslash: \\", "newline": "This sentence\n is on two lines.", "tab": "This sentence \t contains a tab." }

다음 명령을 실행하여 ESCAPES 테이블을 생성하고 JSON을 로드합니다.

create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35)); copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as json 'auto';

ESCAPES 테이블에 대한 쿼리를 실행하여 결과를 확인합니다.

select * from escapes; backslash | newline | tab ------------------------+-------------------+---------------------------------- This is a backslash: \ | This sentence | This sentence contains a tab. : is on two lines. (1 row)

숫자 정밀도 상실

JSON 형식의 데이터 파일에서 숫자 데이터 형식으로 정의된 열로 숫자를 로드할 경우 정밀도가 상실될 수 있습니다. 일부 부동 소수점 값이 컴퓨터 시스템에 정확하게 표시되지 않습니다. 따라서 JSON 파일에서 복사하는 데이터가 예상한 대로 반올림되지 않을 수 있습니다. 정밀도 상실을 방지하려면 다음 대안 중 하나를 사용하는 것이 좋습니다.

  • 값을 큰 따옴표로 묶어서 숫자를 문자열로 표시합니다.

  • ROUNDEC를 사용하여 숫자를 자르지 않고 반올림합니다.

  • JSON 또는 Avro 파일 대신 CSV, 문자로 구분된 형식 또는 고정 너비 텍스트 파일을 사용합니다.