Array
Array(배열)은 같은 데이터 타입을 가진 값이 모여있는 형태입니다.
아래 그림처럼 int컬럼은 Array<int64>의 유형이고, str컬럼은 Array<string>의 유형입니다.
WITH data AS (
SELECT [1, 2, 3, 4, 5] AS int
,['가', '나', '다', '라', '마'] AS str
)
SELECT int, str
FROM data,
UNNEST(int) AS int with OFFSET int_offset,
UNNEST(str) AS str with OFFSEt str_offset
where true
and int_offset = str_offset
;
Array(배열)을 사용하는 이유
- 데이터의 같은 유형을 그룹화 할 수 있어, 접근성이 높습니다.
- 메모리를 보다 효율적으로 관리할 수 있습니다.
Struct
Struct(구조체)는 Array처럼 하나의 데이터 타입만 가질 수 있는 유형가 아닌, 여러 데이터 타입의 필드를 지니는 형태입니다.
아래 사진처럼 각 필드가 여러 타입을 지닐 수 있습니다.
name string, age는 int, hobbies는 array<string>, scores는 array<int64> cities_lives는 array<string>
WITH mixed_data AS (
SELECT STRUCT<
name STRING,
age INT64,
hobbies ARRAY<STRING>,
scores ARRAY<INT64>,
cities_lived ARRAY<STRING>
>(
'홍길동',
30,
['등산', '요리', '음악 감상'],
[85, 90, 78],
['서울', '부산', '대구']
) AS person
)
SELECT person.name, person.age, person.hobbies, person.scores, person.cities_lived
FROM mixed_data;
Struct(구조체)를 사용하는 이유
- 비슷한 목적을 가진 데이터를 구조화 할 수 있습니다.
- 다양한 타입을 그룹화할 수 있으므로, 유연하며 데이터를 핸들링에 용이합니다.
Unnest
Unnest의 뜻은 펼치다, 풀다라는 의미를 가지고 있는데, Sql에서 nested되어 있는 Array, Struct에 대한 구조를 펼칠 수 있는 기능을 제공합니다. 아래 첨부된 사진처럼, 하나의 row에 [apple, banana, orange]로 nested 되어 있는 것을 unnest를 적용하여 오른쪽과 같이 구조를 풀어서 생성할 수 있습니다.
WITH data AS (
SELECT ['apple', 'banana', 'orange'] AS fruits
)
SELECT fruit
FROM data,
UNNEST(fruits) AS fruit;
unnest는 실제 현업에서 다양하게 사용되고 있습니다. 위처럼 이해하기 쉬운 상태로 존재하기도 하지만 이해할 수 없게 되어 있는 경우도 있습니다.
2개 이상의 필드를 지닌 테이블의 Unnest 사용 예시
hobbies, scores 두개는 array의 형태를 지니고 있어서 unnest를 사용하여, array구조를 풀었습니다.
풀어서 Query를 보면 두개의 array의 개수만큼 * 되어서 생성 된 모습을 볼 수 있습니다.
그럼, 홍길동 뿐만 아니라 아래 사진처럼 사람이 더 있다고 보면, 여기서 수영만 하는사람은 어떻게 추출할까요?
- unnest 하여, 서브쿼리로 푸는 방법이 있습니다.
- 서브쿼리가 아닌 바로 하는 방식인 "수영" IN UNNEST(hoobies)도 있습니다.
'빅쿼리(Bigquery)' 카테고리의 다른 글
Window 함수 정리(UNBOUNDED PRECEDING?) 누적합 (0) | 2024.04.02 |
---|---|
Bigquery 테이블 내 컬럼명 변경 방법 (How to change bigquery column name) (0) | 2023.01.11 |
Bigquery - Flashback 편(DB 복구) (0) | 2022.11.28 |
빅쿼리(Bigquery) 소개 (0) | 2022.08.06 |