Contour 표현식의 배열 처리
Contour의 배열은 Expression 보드에서 처리합니다. 배열을 조작한 뒤 다른 보드에서 문자열로 사용하려면 array_join으로 변환합니다. 배열 자체와 쉼표로 연결한 문자열은 서로 다른 자료형입니다.
배열 길이
items_array가 배열 열일 때 다음 Filter 식은 원소가 있는 행을 남깁니다.
array_length("items_array") > 0
array_length는 입력이 null이면 -1을 반환합니다.
고객별 상품 목록
다음은 가상 구매 데이터입니다.
| customer_id | item |
|---|---|
| 123 | bread |
| 123 | eggs |
| 444 | milk |
| 444 | bananas |
| 444 | bread |
Add new column에서 다음 식으로 items_text를 만듭니다.
array_join(array_agg("item") OVER (PARTITION BY "customer_id"), ', ')
array_agg가 고객별로 상품을 배열에 모으고 array_join이 쉼표와 공백으로 연결합니다. OVER를 사용하는 계산은 원래 행을 유지하므로 결과는 고객당 한 행으로 줄어들지 않습니다. 다음은 가능한 배열 순서 중 하나를 표시한 결과입니다.
| customer_id | item | items_text |
|---|---|---|
| 123 | bread | bread, eggs |
| 123 | eggs | bread, eggs |
| 444 | milk | milk, bananas, bread |
| 444 | bananas | milk, bananas, bread |
| 444 | bread | milk, bananas, bread |
구성 요소의 역할은 다음과 같습니다.
| 식 또는 함수 | 역할 |
|---|---|
array_agg("item") | 집계 범위의 값을 배열로 모음 |
array_agg("item") OVER (PARTITION BY "customer_id") | 고객별 배열을 만들되 각 구매 행은 유지 |
| array_agg_distinct | 같은 값이 한 번씩만 들어가는 배열 집계 |
array_join("items_array", ', ') | 실제 배열 열의 원소를 문자열로 연결 |
집계한 배열의 순서를 고정하지 않으면 표시 순서는 달라질 수 있습니다. 값 순서가 필요하면 ARRAY_SORT로 정렬하거나 업무에 맞는 순서를 구성합니다.
고객당 한 배열로 집계
고객당 한 행이 필요하면 Aggregate 모드에서 customer_id를 그룹 열로 지정하고 array_agg("item")을 items_array라는 집계 열로 만듭니다. 해당 결과를 집계 데이터로 전환하여 다음 단계에 사용합니다.
| customer_id | items_array |
|---|---|
| 123 | ["bread", "eggs"] |
| 444 | ["milk", "bananas", "bread"] |
여기서 items_array는 문자열 원소를 가진 실제 배열입니다. 앞의 items_text처럼 문자열로 연결한 값은 explode에 직접 전달하지 않습니다.
배열을 행으로 펼치기
Expression Editor의 Replace column에서 items_array를 선택하고 다음 식을 적용합니다.
explode("items_array")
위의 두 배열 행을 펼치면 다음 다섯 원소 행을 얻습니다.
| customer_id | items_array |
|---|---|
| 123 | bread |
| 123 | eggs |
| 444 | milk |
| 444 | bananas |
| 444 | bread |
다른 보드에서 펼친 값을 쓰려면 이후 Expression 보드에서 결과 열의 자료형을 명시합니다. 이 상품 예제는 문자열입니다.
CAST("items_array" AS STRING)
null 또는 빈 배열인 입력 행도 유지하려면 explode_outer를 사용합니다.
explode_outer("items_array")
| 입력 배열 | explode 결과 | explode_outer 결과 |
|---|---|---|
| null | 출력 행 없음 | null 값 행 하나 |
[] | 출력 행 없음 | null 값 행 하나 |
["bread", null] | bread 행과 null 원소 행 | bread 행과 null 원소 행 |
입력 배열 자체가 null인 경우와 배열 안의 원소가 null인 경우를 구분합니다. EXPLODE 계열은 행을 생성하는 함수이므로 OVER 절을 사용하지 않습니다.