다차원 데이터 테이블
일반적으로 2차원 테이블은 행과 열의 교차점에 데이터가 저장되는 구조로 볼 수 있습니다. 만약 테이블에서 추가적인 그룹화와 인덱싱이 필요하며, 각 차원에 식별자(예: 다중 인덱스)를 부여해야 한다면 더 복잡한 다차원 데이터 구조가 필요합니다.
구아바 테이블은 3차원 이상의 다차원 구조를 직접 지원하지는 않지만, 테이블과 맵, 리스트 등 다른 컬렉션 데이터 구조를 조합하여 다차원 데이터 표현을 모방할 수 있습니다.
1. 중첩 테이블을 이용한 다차원 데이터 구축
가장 직접적인 방법은 테이블의 각 셀을 하위 테이블로 취급하는 것입니다. 즉, 행과 열이 더 깊은 수준의 데이터 구조로 매핑될 수 있습니다. 중첩된 테이블을 통해 3차원 또는 그 이상의 데이터 저장을 구현할 수 있습니다.
예를 들어, 다차원 시계열 데이터를 표현하려면 날짜, 지역 및 지표를 세 가지 차원으로 인덱싱할 수 있습니다.
예시:
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.junit.jupiter.api.Test;
import java.util.Map;
public class 다차원테이블테스트 {
@Test
public void 다차원테이블_테스트() {
// 3차원 테이블 정의: 날짜 -> 지역 -> 지표
Table<String, String, Table<String, Integer>> 다차원테이블 = HashBasedTable.create();
// 지역-지표 테이블 생성
Table<String, Integer> 지역데이터 = HashBasedTable.create();
지역데이터.put("매출", 1000);
지역데이터.put("이익", 200);
// 이 지역 데이터를 해당 날짜와 지역에 저장
다차원테이블.put("2024-12-01", "북부", 지역데이터);
// 다른 지역-지표 테이블 생성
Table<String, Integer> 지역데이터2 = HashBasedTable.create();
지역데이터2.put("매출", 1200);
지역데이터2.put("이익", 300);
// 데이터를 다차원 테이블에 추가
다차원테이블.put("2024-12-01", "남부", 지역데이터2);
// 데이터 조회: 2024-12-01, 북부 지역의 매출 지표
Table<String, Integer> 북부지역데이터 = 다차원테이블.get("2024-12-01", "북부");
Integer 북부매출 = 북부지역데이터.get("매출");
System.out.println("2024-12-01 북부 지역 매출: " + 북부매출); // 출력: 1000
// 다른 차원의 데이터 조회
Table<String, Integer> 남부지역데이터 = 다차원테이블.get("2024-12-01", "남부");
Integer 남부이익 = 남부지역데이터.get("이익");
System.out.println("2024-12-01 남부 지역 이익: " + 남부이익); // 출력: 300
}
}
이 예시에서는 테이블을 중첩하여 3차원 구조를 모방했습니다. 세 개의 인덱스를 통해 특정 값을 유연하게 찾을 수 있습니다.
2. 다차원 조회 및 순회
다차원 데이터 구조에서 조회나 순회를 수행하려면 중첩된 테이블 구조를 사용하여 깊은 수준의 접근을 하거나, 다중 인덱스를 사용하여 데이터를 빠르게 찾고 조작할 수 있습니다.
예시:
@Test
public void 다차원_조회_테스트() {
Table<String, String, Table<String, Integer>> 다차원테이블 = HashBasedTable.create();
// 데이터 생성 및 채우기
Table<String, Integer> 지역데이터1 = HashBasedTable.create();
지역데이터1.put("매출", 2000);
지역데이터1.put("이익", 500);
Table<String, Integer> 지역데이터2 = HashBasedTable.create();
지역데이터2.put("매출", 1500);
지역데이터2.put("이익", 450);
다차원테이블.put("2024-12-01", "북부", 지역데이터1);
다차원테이블.put("2024-12-01", "남부", 지역데이터2);
// 다차원 데이터 순회
for (String 날짜 : 다차원테이블.rowKeySet()) {
System.out.println("날짜: " + 날짜);
for (String 지역 : 다차원테이블.columnKeySet()) {
Table<String, Integer> 해당지역데이터 = 다차원테이블.get(날짜, 지역);
System.out.println("지역: " + 지역);
for (Map.Entry<String, Integer> 항목 : 해당지역데이터.entrySet()) {
System.out.println(항목.getKey() + ": " + 항목.getValue());
}
}
}
}
이 예시는 다차원 테이블을 순회하는 방법을 보여줍니다. rowKeySet()과 columnKeySet()을 사용하여 모든 행과 열을 가져오고 각 차원의 구체적인 값에 접근합니다. 이 방식을 통해 복잡한 다차원 데이터를 유연하게 처리할 수 있습니다.
3. Map을 활용한 추가 차원 구현
4차원 또는 5차원과 같은 더 많은 차원이 필요한 경우, 테이블과 맵을 결합하여 더 많은 수준의 중첩 구조를 생성할 수 있습니다. 이 방법은 테이블의 각 셀을 추가로 캡슐화하고 인덱싱하여 다차원 데이터 관리를 구현합니다.
예시:
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.Map;
public class 추가차원테이블테스트 {
@Test
public void 중첩테이블_추가차원_테스트() {
// 맵 중첩 테이블로 4차원 데이터 모델링: 연도 -> 월 -> 지역 -> 매출/이익 등
Map<String, Table<String, String, Table<String, Integer>>> 중첩테이블 = new HashMap<>();
// 3차원 테이블 구축: 지역 -> 매출/이익 등
Table<String, String, Integer> 지역데이터 = HashBasedTable.create();
지역데이터.put("매출", 1500);
지역데이터.put("이익", 300);
// 데이터를 4차원 테이블에 저장
Table<String, String, Table<String, Integer>> 연도테이블 = HashBasedTable.create();
연도테이블.put("2024", "1월", 지역데이터);
중첩테이블.put("2024", 연도테이블);
// 4차원 데이터 조회
Table<String, String, Integer> 1월데이터 = 중첩테이블.get("2024").get("1월");
Integer 1월매출 = 1월데이터.get("매출");
System.out.println("2024년 1월 매출: " + 1월매출); // 출력: 1500
}
}
여기서는 맵과 테이블의 중첩 방식을 통해 4차원 데이터 구조를 구현했습니다. 이 방법은 복잡한 데이터 모델에서 다차원 인덱싱과 조회를 가능하게 하며, 다차원 데이터 분석 및 처리 시나리오에 적합합니다.
요약
구아바 테이블의 중첩 및 다중 인덱싱 기능을 유연하게 활용하면 다차원 데이터 관리를 쉽게 구현할 수 있습니다. 구아바 테이블 자체는 2차원이지만, 적절한 설계를 통해 3차원 또는 4차원 데이터 저장 및 쿼리를 지원하도록 기능을 확장할 수 있습니다. 이 기법은 복잡한 데이터 모델, 시계열 분석, 다차원 분석 등의 응용 시나리오에서 코드의 간결성과 개발 효율성을 크게 향상시킬 수 있습니다.