Athena의 Array 타입 활용하기
게시일 : 2021년 10월 18일
# Athena
# Array
Athena의 Array 타입 활용하는 법을 알아본다.
ARRAY 타입 기본 활용
ARRAY는 같은 타입으로만 구성되어야 한다. 중첩 ARRAY도 동일하다.
SELECT ARRAY['a','b','c']
-- 중첩 ARRAY ( 정수와 소수는 구분하지 않음 )
SELECT ARRAY[ ARRAY[1,2,3], ARRAY[1.1,2.2,3.0] ]
특정 원소만 추출
WITH
dataset AS (
SELECT ARRAY[1,2,3] AS items
)
SELECT element_at(items, 1)
FROM dataset
KEY, Value 구조 활용
ROW 타입을 활용한다.
WITH dataset AS (
SELECT
CAST(
ROW(33.33, 128.55) AS ROW(lat REAL, lon REAL)
) AS point
)
SELECT point, point.lat, point.lon FROM dataset
point | lat | lon |
---|---|---|
{lat=33.33, lon=128.55} | 33.33 | 128.55 |
STRING => ARRAY
SELECT regexp_split('a_b_c', '_')
-- [a,b,c]
ARRAY => STRING
SELECT array_join(ARRAY['a','b','c'], '_')
-- a_b_c
UNNEST 활용하기
UNNEST는 ARRAY 내의 데이터와 다른 테이블의 데이터를 JOIN하기 위해서 활용할 수 있다.
CROSS JOIN을 활용하여 하나의 ARRAY를 각각의 row로 분리한다. t( ) 안에 새로운 컬럼명을 지정한다.
WITH
dataset AS (
SELECT 1 AS no, ARRAY['a','b','c'] AS items
UNION ALL
SELECT 2 AS no, ARRAY['d','e','f'] AS items
)
SELECT *
FROM dataset, UNNEST(items) AS t(word)
no | items | word |
---|---|---|
1 | [a,b,c] | a |
1 | [a,b,c] | b |
1 | [a,b,c] | c |
2 | [d,e,f] | d |
2 | [d,e,f] | e |
2 | [d,e,f] | f |
SEQUENCE(start, stop, step) 활용
숫자 타입과 타임스탬프 타입을 지원하며, stop의 value는 포함이다.
WITH
dataset AS (
SELECT SEQUENCE(1, 8, 2) AS items
)
SELECT *
FROM dataset, UNNEST(items) AS t(number)
items | number |
---|---|
[1, 3, 5, 7] | 1 |
[1, 3, 5, 7] | 3 |
[1, 3, 5, 7] | 5 |
[1, 3, 5, 7] | 7 |
TIMESTAMP 데이터
시계열 데이터를 활용하여 데이터를 처리할 때 유용하다.
WITH
dataset AS (
SELECT SEQUENCE(TIMESTAMP '2021-01-01 00:00:00', TIMESTAMP '2021-01-01 00:03:00',
INTERVAL '1' MINUTE) AS items
)
SELECT *
FROM dataset, UNNEST(items) AS t(register_at)
items | register_at |
---|---|
[2021-01-01 00:01:00.000, 2021-01-01 00:02:00.000, 2021-01-01 00:03:00.000] | 2021-01-01 00:01:00.000 |
[2021-01-01 00:01:00.000, 2021-01-01 00:02:00.000, 2021-01-01 00:03:00.000] | 2021-01-01 00:02:00.000 |
[2021-01-01 00:01:00.000, 2021-01-01 00:02:00.000, 2021-01-01 00:03:00.000] | 2021-01-01 00:03:00.000 |
집계 함수 사용
array_agg
GROUP BY와 함께 사용하면 데이터를 ARRAY로 모을 수 있다. DISTINCT도 사용 가능하다.
array_agg로 데이터를 모아 다른 데이터와 JOIN 후 다시 UNNEST를 활용하면 유용할 수 있다.
WITH
dataset AS (
SELECT 'a' AS id, 1 AS items
UNION ALL
SELECT 'a' AS id, 2 AS items
)
SELECT id, array_agg(items) AS arr
FROM dataset
GROUP BY id
id | arr |
---|---|
a | [2,1] |
reduce
ARRAY 안의 데이터들을 집계하려면 UNNEST를 사용하여 각각의 데이터로 분리 후 GROUP BY + SUM을 사용할 수 있다.
reduce를 사용하면 처리 시간과 데이터 전송을 줄일 수 있다고 한다.
WITH
dataset AS (
SELECT ARRAY[1,2,3,4] AS items
UNION ALL
SELECT ARRAY[5,6,7,8] AS items
)
SELECT items, reduce(items, 0 , (s, x) -> s + x, s -> s) AS total
FROM dataset
items | total |
---|---|
[5, 6, 7, 8] | 26 |
[1, 2, 3, 4] | 10 |
References
: