JSON 지원
JSON 지원 (JSON Support)
Cassandra 2.2는 SELECT와 INSERT 문에 JSON 지원을 도입했어요. 이 지원은 CQL API를 근본적으로 바꾸지 않아요(예: 스키마는 여전히 적용돼요). 단지 JSON 문서로 작업할 수 있는 편리한 방법을 제공할 뿐이에요.
출처: JSON Support
본문
SELECT JSON
SELECT 문에서 JSON 키워드는 각 행을 단일 JSON 인코딩 맵으로 반환하는 데 사용돼요. SELECT 문의 나머지 동작은 동일해요.
결과 맵 키는 일반 결과 집합의 컬럼 이름과 일치해요. 예를 들어 SELECT JSON a, ttl(b) FROM … 같은 문은 "a"와 "ttl(b)" 키를 가진 맵을 만들어요. 단, 주목할 만한 예외가 하나 있어요. INSERT JSON 동작과의 대칭을 위해, 대문자를 가진 대소문자 구분 컬럼 이름은 큰따옴표로 감싸져요. 예를 들어 SELECT JSON myColumn FROM …은 이스케이프된 따옴표를 가진 "\"myColumn\"" 맵 키를 만들어요.
맵 값은 결과 집합 값의 JSON 인코딩 표현(아래 설명)이에요.
INSERT JSON
INSERT 문에서 새 JSON 키워드는 JSON 인코딩 맵을 단일 행으로 삽입할 수 있게 해 줘요. JSON 맵의 형식은 일반적으로 같은 테이블의 SELECT JSON 문이 반환하는 것과 일치해야 해요. 특히 대소문자 구분 컬럼 이름은 큰따옴표로 감싸야 해요. 예를 들어 "myKey"와 "value"라는 두 컬럼이 있는 테이블에 삽입하려면 다음과 같이 해요.
INSERT INTO mytable JSON '{ "\"myKey\"": 0, "value": 0}';
기본적으로(또는 DEFAULT NULL을 명시적으로 사용하면) JSON 맵에서 생략된 컬럼은 NULL로 설정돼요. 즉, 그 컬럼의 기존 값이 제거되고(그로 인해 tombstone이 생성됨)돼요. 반대로 값 뒤에 DEFAULT UNSET 지시어를 사용하면 생략된 컬럼 값은 unset 상태로 남아 기존 값이 보존돼요.
Cassandra 데이터 타입의 JSON 인코딩
가능한 경우 Cassandra는 데이터 타입을 네이티브 JSON 표현으로 나타내고 받아들여요. 또한 Cassandra는 모든 단일 필드 타입에 대해 CQL 리터럴 형식과 일치하는 문자열 표현을 받아들여요. 예를 들어 float, int, UUID, date는 CQL 리터럴 문자열로 표현할 수 있어요. 그러나 컬렉션, 튜플, 사용자 정의 타입 같은 복합 타입은 네이티브 JSON 컬렉션(맵과 리스트) 또는 그 컬렉션의 JSON 인코딩 문자열 표현으로 표현해야 해요.
다음 표는 Cassandra가 INSERT JSON 값(및 from_json() 인자)에서 받아들이는 인코딩과 SELECT JSON 문(및 from_json())에서 데이터를 반환할 때 사용하는 형식을 설명해요.
| 타입 | 허용되는 형식 | 반환 형식 | 참고 |
|---|---|---|---|
ascii |
string | string | JSON의 \u 문자 이스케이프를 사용해요 |
bigint |
integer, string | integer | 문자열은 유효한 64비트 정수여야 해요 |
blob |
string | string | 문자열은 0x 뒤에 짝수 개의 16진수여야 해요 |
boolean |
boolean, string | boolean | 문자열은 "true" 또는 "false"여야 해요 |
date |
string | string | YYYY-MM-DD 형식, timezone UTC |
decimal |
integer, float, string | float | 클라이언트측 디코더에서 32/64비트 IEEE-754 부동소수점 정밀도를 초과할 수 있어요 |
double |
integer, float, string | float | 문자열은 유효한 정수 또는 float여야 해요 |
float |
integer, float, string | float | 문자열은 유효한 정수 또는 float여야 해요 |
inet |
string | string | IPv4 또는 IPv6 주소 |
int |
integer, string | integer | 문자열은 유효한 32비트 정수여야 해요 |
list |
list, string | list | JSON의 네이티브 리스트 표현을 사용해요 |
map |
map, string | map | JSON의 네이티브 맵 표현을 사용해요 |
smallint |
integer, string | integer | 문자열은 유효한 16비트 정수여야 해요 |
set |
list, string | list | JSON의 네이티브 리스트 표현을 사용해요 |
text |
string | string | JSON의 \u 문자 이스케이프를 사용해요 |
time |
string | string | HH-MM-SS[.fffffffff] 형식의 하루 중 시간 |
timestamp |
integer, string | string | 타임스탬프. 문자열 상수는 timestamps as dates로 입력할 수 있어요. YYYY-MM-DD HH:MM:SS.SSS 형식의 날짜 스탬프가 반환돼요 |
timeuuid |
string | string | Type 1 UUID. UUID 형식은 constant 참조 |
tinyint |
integer, string | integer | 문자열은 유효한 8비트 정수여야 해요 |
tuple |
list, string | list | JSON의 네이티브 리스트 표현을 사용해요 |
UDT |
map, string | map | 필드 이름을 키로 사용하는 JSON의 네이티브 맵 표현 |
uuid |
string | string | UUID 형식은 constant 참조 |
varchar |
string | string | JSON의 \u 문자 이스케이프를 사용해요 |
varint |
integer, string | integer | 가변 길이. 클라이언트측 디코더에서 32/64비트 정수를 오버플로할 수 있어요 |
from_json() 함수
from_json() 함수는 INSERT JSON과 유사하게 단일 컬럼 값에 대해 사용할 수 있어요. INSERT 문의 VALUES 절 또는 UPDATE, DELETE, SELECT 문의 컬럼 값 중 하나로만 사용할 수 있어요. 예를 들어 SELECT 문의 선택 절에는 사용할 수 없어요.
to_json() 함수
to_json() 함수는 SELECT JSON과 유사하게 단일 컬럼 값에 대해 사용할 수 있어요. SELECT 문의 선택 절에서만 사용할 수 있어요.