이 페이지에서는 Spanner를 사용하여 JSON 작업을 수행하는 방법을 설명합니다.
JSON 데이터 유형은 JSON(JavaScript Object Notation) 데이터를 보관하는 데 사용되는 반구조화된 데이터 유형입니다. JSON 형식의 사양은 RFC 7159에 설명되어 있습니다.
JSON은 희소 데이터이거나 느슨하게 정의되거나 변경되는 구조가 있는 데이터의 관계형 스키마를 보완하는 데 유용합니다. 그러나 쿼리 최적화 도구는 관계형 모델을 사용하여 규모에 맞게 효율적으로 필터링, 조인, 집계, 정렬합니다. JSON을 통한 쿼리는 기본 제공되는 최적화가 줄어들고 성능을 검사하고 조정하기 위한 어포던스를 줄일 수 있습니다.
사양
Spanner JSON 유형은 입력 JSON 문서의 정규화된 표현을 저장합니다.
- JSON은 최대 80개 수준까지 중첩될 수 있습니다.
- 공백은 유지되지 않습니다.
- 주석은 지원되지 않습니다. 주석이 있는 트랜잭션 또는 쿼리는 실패합니다.
- JSON 객체의 구성원은 사전순으로 정렬됩니다.
- JSON 배열 요소의 순서는 유지됩니다.
- JSON 객체에 중복된 키가 있는 경우 첫 번째 객체만 보존됩니다.
- 기본 유형(문자열, 부울, 숫자, null)의 유형과 값은 보존됩니다.
- 문자열 유형 값은 정확하게 보존됩니다.
- 숫자 유형 값은 유지되지만 정규화 프로세스로 인해 텍스트 표현이 변경될 수 있습니다. 예를 들어 입력 번호 10000은 1e+4의 정규화된 표현을 포함할 수 있습니다. 숫자 값 보존 시맨틱스는 다음과 같습니다.
- [INT64_MIN, INT64_MAX] 범위의 부호 있는 정수는 유지됩니다.
- [0, UINT64_MAX] 범위의 부호 없는 정수는 유지됩니다.
- 정밀도 손실 없이 문자열에서 double을 거쳐 문자열로 왕복할 수 있는 double 값은 유지됩니다. double 값이 이러한 방식으로 왕복할 수 없으면 트랜잭션 또는 쿼리가 실패합니다.
- 예를 들어
SELECT JSON '2.2412421353246235436'
은 실패합니다. - 기능적 해결 방법은
JSON '2.2412421353246237'
을 반환하는PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
입니다.
- 예를 들어
TO_JSON()
,JSON_OBJECT()
,JSON_ARRAY()
함수를 사용하여 SQL에서 JSON 문서를 구성합니다. 이러한 함수는 필요한 따옴표와 이스케이프 문자를 구현합니다.
정규화된 문서의 최대 허용 크기는 10MB입니다.
null 허용 여부
JSON null
값은 NULL이 아닌 SQL로 처리됩니다.
예를 들면 다음과 같습니다.
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
인코딩
JSON 문서는 UTF-8로 인코딩되어야 합니다. 다른 형식으로 인코딩된 JSON 문서를 사용하는 트랜잭션 또는 쿼리는 오류를 반환합니다.
JSON 열이 있는 테이블 만들기
테이블이 생성될 때 테이블에 JSON 열을 추가할 수 있습니다. JSON 유형 값은 null을 허용할 수 있습니다.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
기존 테이블에서 JSON 열 추가 및 삭제
JSON 열을 기존 테이블에 추가하거나 기존 테이블에서 삭제할 수도 있습니다.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 Venues
테이블에 VenueDetails
라는 JSON
열을 추가하는 방법을 보여줍니다.
C++
C#
Go
자바
Node.js
PHP
Python
Ruby
JSON 데이터 수정
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 JSON
데이터를 업데이트하는 방법을 보여줍니다.
C++
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
JSON 데이터 쿼리
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 JSON
데이터를 쿼리하는 방법을 보여줍니다.
C++
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
제한사항
- JSON 열은 ORDER BY에서 사용할 수 없습니다.
- JSON 유형 열은 색인 생성을 지원하지 않습니다. 하지만 JSON 요소에서 스칼라 값을 추출하는 생성 열에 색인을 만들 수 있습니다.
다음 예시에서는 JSON 요소 VenueDetails
에서 스칼라 값을 추출하는 생성된 열 Details
에 VenueMisc
색인이 생성됩니다.
수정 가능한 json_path는 JSONPath 형식의 STRING 값입니다.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
DateOpened DATE,
VenueDetails JSON,
Details STRING(MAX) AS (JSON_VALUE(VenueDetails, json_path)) STORED
) PRIMARY KEY(VenueId);
CREATE INDEX VenueMisc ON Venues(Details);