빅쿼리(Bigquery)

Biguqery - Array, Struct, Unnest 사용방법 - 1

ROSEV 2024. 4. 6. 17:55

 

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(배열)을 사용하는 이유

  1. 데이터의 같은 유형을 그룹화 할 수 있어, 접근성이 높습니다.
  2. 메모리를 보다 효율적으로 관리할 수 있습니다.

 

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(구조체)를 사용하는 이유

  1. 비슷한 목적을 가진 데이터를 구조화 할 수 있습니다.
  2. 다양한 타입을 그룹화할 수 있으므로, 유연하며 데이터를 핸들링에 용이합니다.

 

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의 개수만큼 * 되어서 생성 된 모습을 볼 수 있습니다.

 

 

그럼, 홍길동 뿐만 아니라 아래 사진처럼 사람이 더 있다고 보면, 여기서 수영만 하는사람은 어떻게 추출할까요?

 

 

 

 

  1. unnest 하여, 서브쿼리로 푸는 방법이 있습니다.
  2. 서브쿼리가 아닌 바로 하는 방식인 "수영" IN UNNEST(hoobies)도 있습니다.